2016-07-07 3 views
0
CREATE PROCEDURE GetUserDetails 
(
    @ParameterListWithDataType VARCHAR(MAX), 
    @ParameterNameList  VARCHAR(MAX), 
    @ParameterValues  VARCHAR(MAX), 
    @WhereCondition  VARCHAR(MAX) 
) 
AS 
BEGIN 
    DECLARE @sql NVARCHAR(4000) 
    SET @sql = ' SELECT FirstName, MiddleName, LastName, Address, Salary FROM UserDetails WHERE ' + @WhereCondition 

    EXEC sp_executesql @sql, @ParameterListWithDataType, @ParameterNameList 
END 

EXEC GetUserDetails @ParameterListWithDataType = '@FirstName VARCHAR(100)', @ParameterNameList = '@FirstName', @ParameterValues = 'ABC', @WhereCondition = 'FirstName = @FirstName ' 

EXEC GetUserDetails @ParameterListWithDataType = '@FirstName VARCHAR(100), @LastName VARCHAR(100)', @ParameterNameList = '@FirstName,@LastName', @ParameterValues = '''ABC'', ''XYZ''', @WhereCondition = 'FirstName = @FirstName OR LastName = @LastName' 

EXEC GetUserDetails @ParameterListWithDataType = '@FirstName VARCHAR(100), @LastName VARCHAR(100), @MiddleName VARCHAR(100)', @ParameterNameList = '@FirstName,@LastName,@MiddleName', @ParameterValues = '''ABC'', ''XYZ'', ''DEF''', @WhereCondition = 'FirstName = @FirstName OR LastName = @LastName OR MiddleName = @MiddleName' 

このような方法はありますか?検索条件は動的になるためです。ご意見をお寄せいただくか、sp_executesqlに動的なパラメータ数を使用する代替ソリューションを教えてください。動的引数にsp_executesqlを使用する

ありがとうございました。

+0

を使用してプロシージャを実行しますか?これは、何のメリットもなくフィルタリングすることをより複雑にするように思えます。 – adrianm

+0

@adrianm私はあなたのポイントを得ることはありません。検索基準に使用される列は動的であるためです。私はこれを達成するためにビューを使用する方法を知らない。 – Vignesh

+0

'@ ParameterListWithDataType'の' Nvarchar'です。通常の解決方法は、静的SQL、オプションの述語、 'option(再コンパイル)'です。 –

答えて

0

このクエリが役に立ちます。ビューを使用しないのはなぜ

CREATE PROCEDURE GetUserDetails 
(
    @FirstName VARCHAR(MAX), 
    @LastName  VARCHAR(MAX), 
    @MiddleName  VARCHAR(MAX) 
) 
AS 
BEGIN 
    DECLARE @sql NVARCHAR(4000) 
    DECLARE @WhereCondition VARCHAR(MAX) 

    SET @WhereCondition = ' WHERE 1 = 1'+case when @FirstName is null then '' else ' or FirstName = '+ @FirstName end+ 
          case when @LastName is null then '' else ' or LastName = '+ @LastName end+ 
          case when @MiddleName is null then '' else ' or MiddleName = '+ @MiddleName 
          end 

    SET @sql = ' SELECT FirstName, MiddleName, LastName, Address, Salary FROM UserDetails' + @WhereCondition 

    EXECUTE(@sql) 

END 

は単に

EXEC GetUserDetails 'ABC','XYZ','DEF' 
+0

私はこのアプローチをすでに試していました。しかし、SQLインジェクションを避けるためには、sp_executesqlを使用する必要があります。私があなたの手続きのために以下の入力を与えると、私たちのテーブルは削除されるでしょう。 EXEC GetUserDetails 'a'、 ''、 '' '' ';テーブルを削除する - ' – Vignesh

関連する問題