我在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
答案 0 :(得分:2)
您可以使用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"});
我的结果:
答案 1 :(得分:-1)
在调用过程(U-SQL)的示例下,官方U-SQL语言参考站点添加了如何将数组传递给存储过程的示例。查看对getPeople的调用。
getPeople的定义可以在CREATE PROCEDURE(U-SQL)中看到。
(注意:会提供链接,但是当我这样做时,上帝会继续删除我的回复。只需搜索&#34;调用程序(U-SQL)&#34;。)