2017-02-05 12 views
0

私のコードで何が問題になっていますか?私はselect文とwhere句の変数値を渡したい:SELECTステートメントをSQL Serverのストアドプロシージャのパラメータとして渡す方法はありますか。

ALTER PROC sp_ac_getItemLookupCode 
    @itemlookupcode varchar(20) = null, 
    @select varchar(30) 
AS 
BEGIN 
    SELECT DISTINCTT 
     @select 
    FROM 
     [ReportHQMatajer].[dbo].[JFC_ItemDailySalesParent] pp 
    WHERE 
     ItemLookupCode LIKE @itemlookupcode+'%' 
END 

上記は私のストアドプロシージャです。私は、次のコードを実行し、それだけで

sp_ac_getItemLookupCode @select='ItemLookupCode',@itemlookupcode=1 

それはすべての値を返すされていない列Nameを返します。

ALTER PROC sp_ac_getItemLookupCode (
    @itemlookupcode varchar(20) = null, 
    @select varchar(30) 
) AS 
BEGIN 
    declare @sql = nvarchar(max); 

    set @sql = ' 
select distinct @select 
from [ReportHQMatajer].[dbo].[JFC_ItemDailySalesParent] pp 
'; 

    set @sql = replace(@sql, '@select', @select); 

    if (@itemlookupcode is not null) 
    begin 
     set @sql = @sql + 'where ItemLookupCode like ''' + @itemlookupcode + '%''' 
    end; 

    exec sp_executesql @sql; 
END; 

私がコメントを追加しました:それは

+1

"ダイナミックSQL" –

+1

サイドノート:ストアドプロシージャのプレフィックス 'sp_'を使用しないでください**。マイクロソフトは、[*ストアドプロシージャの名前付け*を参照してください](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx)、およびあなたはいつか名前衝突のリスクを将来実行します。 [ストアドプロシージャのパフォーマンスにも悪い](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)単に 'sp_'を避け、他の何かを接頭辞として使うのが最善です。 –

答えて

0

次のようSP_EXECUTESQLシステムストアドproecuresを使用して経由で動的なクエリを使用する: -

ALTER PROC sp_ac_getItemLookupCode 
@itemlookupcode varchar(20)= null, 
@select varchar(30) 
AS 
BEGIN 
declare @Query nvarchar(2000) 
set @Query = 
    'select distinct ' + @select + ' 
    FROM 
     [ReportHQMatajer].[dbo].[JFC_ItemDailySalesParent] pp 
    WHERE 
     ItemLookupCode like ''' + @itemlookupcode+ + '%'' ' 
exec sp_executesql @Query 
END 
+0

それはSQLインジェクションを引き起こしますか? –

+0

% –

+0

@Abbas付近の構文が正しくありません。回答が編集されました。もう一度やり直してください。 –

-1

あなたは列名(またはテーブル名や関数名など)を渡したい場合は、動的SQLを使用する必要があり、結果として列名を返します。 @itemlookupcodeNULLの場合、すべての行を戻します。

+0

コードのエラー –

+0

どのような種類のエラーです。そしてなぜdownvote? –

0

あなたは、パラメータとしてカラム名を渡したい場合、あなたは次のように、あなたの動的なクエリを作成する必要があります: -

Exec ('select distinct '[email protected]+' 
    FROM 
     [ReportHQMatajer].[dbo].[JFC_ItemDailySalesParent] pp') 
関連する問題