如何将数组传递给 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 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"});

我的结果:

已在官方 U-SQL 语言参考站点的调用过程 (U-SQL) 示例下添加了如何将数组传递给存储过程的示例。查看对 getPeople 的调用。

getPeople的定义见CREATE PROCEDURE (U-SQL).

(注意:会提供链接,但上帝会在我这样做时不断删除我的回复。只需搜索 "Calling a Procedure (U-SQL)"。)