存储过程sql server中的表达式

时间:2014-05-07 08:34:37

标签: sql sql-server stored-procedures sql-server-2012

我想在SQL Server 2012中创建一个存储过程,它接受一个短语作为条件。 我正在编写动态发送参数的报告。

该过程类似于以下内容,其中变量@WHERE需要替换为我作为输入发送的字符串。

CREATE PROCEDURE [dbo].[TEST] 
    @WHERE NVARCHAR(200)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT * FROM MTRL WHERE @WHERE
END

所以执行必须是

execute TEST 'AND PRODUCT=3 AND DATE IS NULL'

我不想明确变量。例如,要使用

WHERE PRODUCT=@PRODUCT AND DATE = @DATE AND NAME LIKE '%@NAME' 

因为这可能会有所变化。根据用户选择,每次过滤器对于同一报告都是多个且不同的。

我在尝试通用解决方案时遇到的错误是

  

在预期条件的上下文中指定的非布尔类型的表达式,接近' END'。

2 个答案:

答案 0 :(得分:2)

在这种情况下,你需要动态sql,所以按照下面的方法改变sp

CREATE PROCEDURE [dbo].[TEST] 
   @WHERE NVARCHAR(200)
AS
BEGIN
SET NOCOUNT ON;
    exec('SELECT * FROM MTRL WHERE 1= 1 ' + @WHERE)
END

答案 1 :(得分:0)

不建议将条件动态附加到where子句,因为您将容易受到SQL注入攻击。

但如果需要,您可以尝试以下方法:

declare @sql nvarchar(500)
set @sql='SELECT * FROM MTRL WHERE'+ @WHERE
execute sp_executesql @sql