web-dev-qa-db-ja.com

SSRSの複数の値パラメーターをストアード・プロシージャーに渡す

SQL Server 2012ストアドプロシージャのテーブルタイプパラメータに、複数の値の文字列パラメータを渡そうとしています。このコードをSSRSのデータセットに貼り付けます。

DECLARE @mylist clinic_list_tbltype
INSERT @mylist(n) VALUES (@pm_ChooseClinics)
EXEC sp_Skillset_Summary_With_Callbacks_Report @mylist, @pm_ChooseInterval, @pm_StartDateTime, @pm_EndDateTime

clinical_list_tbltypeは、「n」という名前の1つのvarchar(50)フィールドを使用して作成したテーブルタイプです。このストアドプロシージャは、SSMSokから呼び出すことができます。このように(そしてそれは非常に速く戻ってきます):

DECLARE @mylist clinic_list_tbltype
INSERT @mylist(n) VALUES ('clinicA'), ('clinicB')
EXEC sp_Skillset_Summary_With_Callbacks_Report  @mylist, 'Daily', '6/3/2014', '6/9/2014'

SSRSで実行できるのは1つのクリニックだけです(ただし非常に遅いです)が、複数のクリニックを試してみると、次のようなエラーが発生します。

iNSERTステートメントには、Values句で指定された値よりも少ない列があります

。 1つのclnicで実行しても機能しますが、SSMSでクエリを実行する場合に比べて非常に長い時間がかかります。 2分対1秒のように。 ( 'clinicA')、( 'clinicB')の代わりに( 'clinicA'、 'clinicB')を渡しているためである必要があります。

実行する方法?

10
urbanmojo

そうです、私はあなたにいくつかの背景を与える必要があります。

SSRSパラメーターで複数の値を選択できるようにすると、複数の値を選択すると、値のコンマ区切り文字列が1つの文字列として作成されます。

_  'value1,value2,value3'
_

IN演算子を使用して文字列の値を確認するには、次のようなコンマで連結された文字列が必要です..。

_  'value1','value2','value3'
_

あなたの手順

これで、procで値を明示的に挿入すると、テーブルに複数の値が挿入されます。

_  INSERT INTO Table_Value_Param
  VALUES ('value1'),       --<-- 1st value/Row
         ('value2'),       --<-- 2nd Value/Row
         ('value3')        --<-- 3rd Value/Row
_

これにより、プロシージャ内で次のようなステートメントを実行したときに期待される結果が返されます。

_SELECT * 
FROM Table_Name
WHERE ColumnName IN (SELECT ColumnName 
                     FROM Table_Value_Param)
_

一方、SSRSレポートパラメータを使用してテーブルに挿入しようとすると、テーブルは次のような値を挿入します。

_  INSERT INTO Table_Value_Param
  VALUES ('value1,value2,value3')   --<-- One Row/Value containing all the values comma separated
_

ソリューション

この状況でTVPを作成しても、実際には役に立ちません。私が行うことは、プロシージャ内でdbo.Split()関数を使用することです。

分割関数の多くの定義をオンラインで見つけることができます。いくつかのクールなものについては、ここを参照してください _Split Function equivalent in tsql?_

この分割関数を作成したら、プロシージャ定義内でこの関数を使用するだけで、テーブル値のパラメータも必要ありません。

このようなもの...

_  SELECT * 
  FROM Table_Name 
  WHERE ColumnName IN ( 
                       SELECT Value
                       FROM dbo.Split(@Report_Param, ',')
                       ) 
_
7
M.Ali
declare @Vendors_Filter nvarchar(max) = 'a,b,c'
declare @Vendors nvarchar(max) 
set @Vendors =''''+replace(@Vendors_Filter,',',''',''')+'''' 
select @Vendors
0
Voucik