如何将数组传递给 SQL 存储过程
How to pass an array to USQL Stored Procedure
我在 Azure DataLake 中创建了一个名为 "Catalog" 的 table。
此 table 包含 "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;
这只是测试解决方案,我将用它与其他 table 结合。
它工作正常,但我想知道还有其他解决方案吗?
在 TSQL 中,我会使用 temp tables。我应该在 DataLake 和 USQL 中使用什么?
顺便说一句,我不会写
new SQL.ARRAY<string>(@CatalogCodes.Split(','))
我必须将@CatalogCodes 传递给table。然后我可以使用 SQL.ARRAY
您可以使用 SQL.ARRAY
作为 U-SQL 中的存储过程参数传递数据。只需与CROSS APPLY
和EXPLODE
一起使用即可,无需单独拆分。你是这个意思吗?试试这个简单的例子:
设置脚本:
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"});
我的结果:
已在官方 U-SQL 语言参考站点的调用过程 (U-SQL) 示例下添加了如何将数组传递给存储过程的示例。查看对 getPeople 的调用。
getPeople的定义见CREATE PROCEDURE (U-SQL).
(注意:会提供链接,但上帝会在我这样做时不断删除我的回复。只需搜索 "Calling a Procedure (U-SQL)"。)
我在 Azure DataLake 中创建了一个名为 "Catalog" 的 table。 此 table 包含 "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;
这只是测试解决方案,我将用它与其他 table 结合。 它工作正常,但我想知道还有其他解决方案吗? 在 TSQL 中,我会使用 temp tables。我应该在 DataLake 和 USQL 中使用什么?
顺便说一句,我不会写
new SQL.ARRAY<string>(@CatalogCodes.Split(','))
我必须将@CatalogCodes 传递给table。然后我可以使用 SQL.ARRAY
您可以使用 SQL.ARRAY
作为 U-SQL 中的存储过程参数传递数据。只需与CROSS APPLY
和EXPLODE
一起使用即可,无需单独拆分。你是这个意思吗?试试这个简单的例子:
设置脚本:
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"});
我的结果:
已在官方 U-SQL 语言参考站点的调用过程 (U-SQL) 示例下添加了如何将数组传递给存储过程的示例。查看对 getPeople 的调用。
getPeople的定义见CREATE PROCEDURE (U-SQL).
(注意:会提供链接,但上帝会在我这样做时不断删除我的回复。只需搜索 "Calling a Procedure (U-SQL)"。)