2012-05-03 4 views
1

複数のvarchar(4000)パラメータ(26個)を受け入れるプロシージャがあります。パラメータをループするためのconcatパラメータ名

それぞれはコンマで区切られた値の文字列です。

これらの文字列が渡されると、それぞれの文字列を分割し、後でprocで使用できるように一時テーブルに挿入したいと思います。

私は、各パラメータを個別に処理する文章を書くのではなく、カウンタに依存して各パラメータをループして順番に処理するwhileループを記述したいと考えています。現在、私は以下を試してみましたが、正しくありません。

CREATE PROCEDURE [dbo].[myproc] (
    @string1 varchar(4000) = null; 
    @string2 varchar(4000) = null; 
    @string3 varchar(4000) = null; 
    ....declare @string4 -> @string25... 
    @string26 varchar(4000) = null;) 

CREATE TABLE #emails (
    address varchar(80) 
    ) 

Set @counter = 1 

WHILE @counter < 27 
BEGIN 
INSERT INTO #emails(address) SELECT element as address from FT_SPLIT_LIST(isNull('@string'+convert(varchar,@counter),''),',') 
SET @counter = @counter +1 
END 

SELECT * FROM #emails 

現在のところ、@ string1 - > @ string26のすべてのCSVを含む表は返されません。

FT_SPLIT_LIST作品 - 他の多くの場所で使用しています。私はそれに渡されているパラメータを動的に宣言する方法があるかどうかを知る必要がありますか?

@ string1 - > @ string27の各パラメータの文を記述することなく、達成しようとしていることを行う方法はありますか?

おかげで、 C

+0

使用しているSQL Serverのバージョンは? – Oded

+0

私は2008 R2を使用しています – csza

+0

これらのパラメータはどれくらいありますか?これは、これを行うための「間違った」方法がほぼ確実です。 @オデッドの答えはそれが良いはずだと思われる。それがうまくいかない場合は、 'LOAD'を介して一時テーブルにデータをロードすることができます(おそらく' IMPORT'ですか?)。 –

答えて

2

SQL Server 2008および上記はtable valued parametersを持っている:

テーブル値パラメータは、ユーザー定義テーブル型を使用して宣言されています。テーブル値のパラメータを使用すると、一時テーブルや多数のパラメータを作成することなく、複数の行のデータをTransact-SQL文またはストアドプロシージャや関数などのルーチンに送信できます。

これはカンマ区切りのvarcharsとFT_SPLIT_LISTよりはるかに優れたオプションです。

このトピックに関する包括的な説明については、Erland SommarskogのArrays and Lists in SQL Server 2008 Using Table-Valued Parametersを読むことをお勧めします。

+0

Oded、応答ありがとう。間違いなくあなたが投稿したリンクを調べます。 – csza

+0

+1私はここでTVPについて投稿しました...間違いなくCSVをループするのに好ましい方法です.... – Matthew

関連する問題