如何将数组传递给USQL存储过程

时间:2017-01-11 11:18:07

标签: azure azure-data-lake u-sql

我在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

2 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:-1)

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

getPeople的定义可以在CREATE PROCEDURE(U-SQL)中看到。

(注意:会提供链接,但是当我这样做时,上帝会继续删除我的回复。只需搜索&#34;调用程序(U-SQL)&#34;。)