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')を渡しているためである必要があります。
実行する方法?
そうです、私はあなたにいくつかの背景を与える必要があります。
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, ',')
)
_
declare @Vendors_Filter nvarchar(max) = 'a,b,c'
declare @Vendors nvarchar(max)
set @Vendors =''''+replace(@Vendors_Filter,',',''',''')+''''
select @Vendors