2017-01-11 22 views
2

「カタログ」という名前のAzure DataLakeでテーブルを作成しました。 この表には、Idとして「CatalogCode」列が含まれています。 カタログコードを渡してカタログを取得するストアドプロシージャを作成したいとします。配列をUSQLストアドプロシージャに渡す方法

私はこのような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で何を使うべきですか?

ところで、私はテーブルに@CatalogCodesを渡す必要があります

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

を書いたことはできません。次に、SQL.ARRAYを使用できます

答えて

2

SQL.ARRAYを使用してデータをU-SQLのストアドプロシージャパラメータとして渡すことができます。 CROSS APPLYEXPLODEと一緒に使用してください。別々に分割する必要はありません。それはあなたが意味することですか?この単純な例を試してみてください。

セットアップスクリプト:SQL.ARRAYパラメーターを指定してストアドプロシージャ

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); 

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

+0

こんにちはwBobは、あなたの答えをありがとう!あなたのソリューションは素晴らしいです、私はパラメータとしてSQL.ARRAYを渡すことについても考えていませんでした。 1つの問題があります。ストアドプロシージャにもう1つのパラメータを追加しようとすると、その後にエラーが発生します。 dbo.testProc(@codes SQL.ARRAY 、@秒ストリング)およびdbo.testProc(新しいSQL.ARRAY {"a"、 "c"}、 "test")を作成します。 [エラーのある画像](http://i.imgur.com/iFYEso2.png)何が間違っていますか? –

+0

現時点では、あなたは他の方法で試してみましたか? – wBob

+1

abarbolin:これは最終的に修正するためにバックログに記載されている既知の問題です。現在の回避策は、最初の引数の式の周りに余分な括弧を追加することです。 回避策は、最初のパラメータの周りに余分な括弧を入れます。 'dbo.testProc((新しいSQL.ARRAY {" a "、" c "})、" test ");' –

-1

ストアドプロシージャに配列を渡す方法についての例は、手順(U-SQL)を呼び出すことで実施例の下で公式U-SQL言語リファレンスサイトで追加されています。 getPeopleの呼び出しを参照してください。

getPeopleの定義は、CREATE PROCEDURE(U-SQL)で確認できます。

(注意:リンクを提供しますが、神は、私はただ、「(U-SQL)プロシージャのコール」の検索を行うのですかとき私の回答を削除続けるだろう)

関連する問題