我想在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'。
答案 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