2016-07-07 68 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,可選謂詞和'選項(重新編譯)'。 –

回答

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','','''''; drop table Person--' – Vignesh