2016-05-27 18 views
0

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', '%', '%','%' ,'%','%','%','%','%','%')

+0

このエラーは、正確には何を意味しているのですか。関数内でストアドプロシージャ(この例では 'sp_executesql')を実行しようとしていますが、これは許可されていません。動的SQLを実行する必要がある場合は、関数ではなくストアド・プロシージャ内から実行します。 – ZLK

+0

他の方法で関数内に動的なクエリを構築できますか?私は結合された結果を得るために他の関数の結果と関数を結合する必要があります。 – Cookie

+0

ストアドプロシージャを使用すると、テーブル結合構造を持つことはできません。 – Cookie

答えて

0

なぜ動的SQLすべてで、この機能を実行するのですか?それは理由がありません:

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 join xyz CD on CD.MARKETED_BY=R.Sales_Code 
left 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 @sales_code when '' then '%' when 'None' then '%' else @sales_code end 
    and r.Branch_code like case @branch_id when '' then '%' when 'None' then '%' else @branch_id end 
    and cd.CASA like case @casa WHEN '' then '%' when 'None' then '%' else @casa end 
    and r.Designation02 like case @designation02 when '' then '%' when 'None' then '%' else @designation02 end 
    /* and so on */ 
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 

これは「ダイナミック」t-sqlを削除する以外は、エディションなしのコードです。

そして、はい、設計により多くの制限があり機能:
https://msdn.microsoft.com/en-us/library/ms191320.aspx

はとにかく書かれた述語は非常に奇妙です。 「好き」がない場合、なぜ「好き」ですか?さらに

... 
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 (@sales_code in ('', 'None') or r.Sales_Code = @sales_code) 
    and (@branch_id in ('', 'None') or r.Branch_code = @branch_id) 
    and (@casa in ('', 'None') or cd.CASA = @casa) 
    and (@designation02 in ('', 'None') or r.Designation02 = @designation02) 
    /* and so on */ 

:idをはvarchar型である理由、BRANCH_IDがNULLの場合、このコードは何をすべきか...

in私はsucheとexists それはoption(recompile)を追加することがおそらく良いでしょう述語にリライトすることをお勧めしたいですしかし、私はそれらのテーブルに多くのインデックスがないと思います。

関連する問題