gpt4 book ai didi

azure - 如何将数组传递给 SQL 存储过程

转载 作者:行者123 更新时间:2023-12-02 07:11:39 25 4
gpt4 key购买 nike

我在 Azure DataLake 中创建了一个名为“Catalog”的表。该表包含“CatalogCode”列作为 ID。我想创建存储过程来通过传递目录代码来获取目录。

我使用 SQL.ARRAY 编写它,如下所示:

CREATE SCHEMA IF NOT EXISTS Export;

DROP PROCEDURE IF EXISTS Export.PrepareContent;

CREATE PROCEDURE IF NOT EXISTS Export.PrepareContent(@CatalogCodes string)
AS
BEGIN;

@CatalogCodesOneString = SELECT * FROM (VALUES(@CatalogCodes)) AS t(CodesString);

@CatalogCodesTable =
SELECT new SQL.ARRAY<string>(CodesString.Split(',')) AS Codes FROM @CatalogCodesOneString;

@CatalogCodesExploded =
SELECT Code.Trim() AS Code
FROM @CatalogCodesTable
CROSS APPLY
EXPLODE(Codes) AS r(Code);

OUTPUT @CatalogCodesExploded
TO "/outputs/explosion.tsv"
USING Outputters.Tsv();

END;

这只是测试解决方案,我将用它来与其他表连接。它工作正常,但我想知道还有其他解决方案吗?在 TSQL 中我会使用临时表。我应该在 DataLake 和 USQL 中使用什么?

顺便说一句,我不会写

new SQL.ARRAY<string>(@CatalogCodes.Split(','))

我必须将 @CatalogCodes 传递到表中。然后我可以使用 SQL.ARRAY

最佳答案

您可以使用SQL.ARRAY作为U-SQL中的存储过程参数来传递数据。只需与CROSS APPLYEXPLODE一起使用即可,无需单独拆分。你是这个意思吗?试试这个简单的例子:

安装脚本:

DROP TABLE IF EXISTS dbo.test;

CREATE TABLE IF NOT EXISTS dbo.test
(
x string,
y int,

INDEX idx_test
CLUSTERED(x ASC) DISTRIBUTED BY ROUND ROBIN
);


INSERT INTO dbo.test ( x, y )
SELECT *
FROM(
VALUES
( "a", 1 ), ( "b", 2 ), ( "c", 3 )
) AS t(x,y);

带有 SQL.ARRAY 参数的存储过程

CREATE PROCEDURE dbo.testProc(@codes SQL.ARRAY<string>)
BEGIN

@rs =
SELECT t.x,
t.y
FROM dbo.test AS t
CROSS APPLY
EXPLODE( @codes ) AS a(x)
WHERE t.x == a.x;


OUTPUT @rs
TO "/output/output.csv"
ORDER BY x
USING Outputters.Csv(quoting : false);

END;

存储过程调用

dbo.testProc(new SQL.ARRAY<string>{"a", "c"});

我的结果:

My results

关于azure - 如何将数组传递给 SQL 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41589489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com