【问题标题】:Expression in stored procedure sql server存储过程 sql server 中的表达式
【发布时间】:2014-05-07 08:34:37
【问题描述】:

我想在 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”。

【问题讨论】:

  • 您提出的解决方案是等待发生的 SQL 注入攻击。除非您完全确定自己知道自己在做什么,否则不应这样做。
  • 是的。很高兴提到这一点。应考虑使用存储过程的参数化输入

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


【解决方案1】:

在这种情况下,您需要动态 sql,因此请按照以下方式更改 sp

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多