2016-07-07 92 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