tablenameに基づいてクエリを生成できるSQL Server関数を作成しようとしました。 しかし、私はこのエラーを取得しています:TSQL関数内の動的クエリはできません
Msg 557, Level 16, State 2, Line 1 Only functions and some extended stored procedures can be executed from within a function.
コードは以下の通りです:
create function fn_test (@adate varchar(10), @abc_code
nvarchar(100),@b_id nvarchar(100), @c1 nvarchar(100),
@own_retained_id nvarchar(100) , @designation02 nvarchar(100), @currency_id nvarchar(100),
@Core_ID nvarchar(100), @Slab_ID nvarchar(100), @Product_03_ID nvarchar(100),
@Category_03_ID nvarchar(100), @PRODUCT_CLASS nvarchar(100),@SEGMENT_CODE nvarchar(100)) returns @t table(wdate
varchar(10) , sale_code nvarchar(100) ,Branch_code nvarchar(100) ,
CASA nvarchar(100),Owned_Retained_ID nvarchar(100),
Designation02 nvarchar(100),Currency_ID nvarchar(100) ,Core_ID nvarchar(100) , Slab_ID nvarchar(100), Product_03_ID
nvarchar(100), Category_03_ID nvarchar(100),PRODUCT_CLASS
nvarchar(100),
SEGMENT_CODE nvarchar(100), CD_Bal_pkr float)
as begin declare @sql nvarchar(max) set @sql = N'select cd.wdate
, a.Sale_Code,r.Branch_code ,cd.CASA ,cd.Owned_Retained_ID ,
r.Designation02 , a.Currency_ID , cd.Core_ID , cd.Slab_ID ,
a.Product_03_ID , a.Category_03_ID, cd.PRODUCT_CLASS,cd.SEGMENT_CODE,
sum(cd.pkr_open_clr_balance) CD_Bal_pkr from lov_rm r left outer
join xyz CD on CD.MARKETED_BY=R.Sales_Code left outer join
BIU_Accounts a on a.Acct_Number = cd.ACCT_NUMBER where
r.Sales_Code = a.Sale_Code and cd.WDATE = ''' + @wdate + ''' and
a.Sales_Code_ID_Current in (select RM_ID from LOV_RM where
Designation02 = ''SE-CASA'') and r.Sales_Code like case ' + CHAR(39) +
@sales_code + CHAR(39)+' when '''' then ''%'' when ''None'' then ''%''
else ' + CHAR(39) + @sales_code +CHAR(39) + ' end AND r.Branch_code
like case ' + CHAR(39) + @branch_id +CHAR(39)+' when '''' then ''%''
when ''None'' then ''%'' else ' + CHAR(39) + @branch_id +CHAR(39) + '
end AND cd.CASA like case ' + CHAR(39) + @casa +CHAR(39)+' when
'''' then ''%'' when ''None'' then ''%'' else ' + CHAR(39) + @casa
+CHAR(39) + ' end and r.Designation02 like case ' + CHAR(39) + @designation02 +CHAR(39)+' when '''' then ''%'' when ''None'' then
''%'' else ' + CHAR(39) + @designation02 +CHAR(39) + ' end AND
cd.Owned_Retained_ID like case ' + CHAR(39) + @own_retained_id
+CHAR(39)+' when '''' then ''%'' when ''None'' then ''%'' else ' + CHAR(39) + @own_retained_id +CHAR(39) + ' end and a.Currency_ID
like case ' + CHAR(39) + @currency_id +CHAR(39)+' when '''' then
''%'' when ''None'' then ''%'' else ' + CHAR(39) + @currency_id
+CHAR(39) + ' end and cd.Core_ID like case ' + CHAR(39) + @Core_ID +CHAR(39)+' when '''' then ''%'' when ''None'' then ''%''
else ' + CHAR(39) + @Core_ID +CHAR(39) + ' end and cd.Slab_ID
like case ' + CHAR(39) + @Slab_ID +CHAR(39)+' when '''' then ''%''
when ''None'' then ''%'' else ' + CHAR(39) + @Slab_ID +CHAR(39) + '
end and a.Product_03_ID like case ' + CHAR(39) + @Product_03_ID
+CHAR(39)+' when '''' then ''%'' when ''None'' then ''%'' else ' + CHAR(39) + @Product_03_ID +CHAR(39) + ' end and a.Category_03_ID
like case ' + CHAR(39) + @Category_03_ID +CHAR(39)+' when '''' then
''%'' when ''None'' then ''%'' else ' + CHAR(39) + @Category_03_ID
+CHAR(39) + ' end and cd.PRODUCT_CLASS like case ' + CHAR(39) + @PRODUCT_CLASS +CHAR(39)+' when '''' then ''%'' when ''None'' then
''%'' else ' + CHAR(39) + @PRODUCT_CLASS +CHAR(39) + ' end and
cd.SEGMENT_CODE like case ' + CHAR(39) [email protected]_CODE +CHAR(39)+'
when '''' then ''%'' when ''None'' then ''%'' else ' + CHAR(39) +
@SEGMENT_CODE +CHAR(39) + ' end
group by cd.wdate , a.Sale_Code, r.Branch_code , cd.CASA ,
cd.Owned_Retained_ID , r.Designation02 , a.Currency_ID , cd.Core_ID
, cd.Slab_ID , a.Product_03_ID , a.Category_03_ID,cd.PRODUCT_CLASS,
cd.SEGMENT_CODE '
print @sql EXECUTE sp_executesql @sql return end
は私がselect * from fn_portal_biu('2016-05-17', '%', 22,'CA', '%', '%','%' ,'%','%','%','%','%','%')
このエラーは、正確には何を意味しているのですか。関数内でストアドプロシージャ(この例では 'sp_executesql')を実行しようとしていますが、これは許可されていません。動的SQLを実行する必要がある場合は、関数ではなくストアド・プロシージャ内から実行します。 – ZLK
他の方法で関数内に動的なクエリを構築できますか?私は結合された結果を得るために他の関数の結果と関数を結合する必要があります。 – Cookie
ストアドプロシージャを使用すると、テーブル結合構造を持つことはできません。 – Cookie