当前位置: 首页 > 面试题库 >

通过WHERE子句传递SQL存储过程的整体

郑正阳
2023-03-14
问题内容

我有一个形式的SQL存储过程

SELECT [fields] FROM [table] WHERE @whereSql

我想向过程传递一个参数(@whereSql),该参数指定整个WHERE子句,但返回以下错误:

An expression of non-boolean type specified in a context where a condition is expected

能做到吗?


问题答案:

简短的答案是您不能这样做-SQL Server将变量的内容视为VALUE。它不会动态构建要执行的字符串(这就是为什么这是避免SQL注入攻击的 正确
方法)的原因。

您应该尽一切努力避免动态的WHERE,主要是因为这个原因,也是为了提高效率。相反,请尝试建立WHERE子句,以使它根据情况使具有许多OR的部件短路。

如果没有办法解决,您仍然可以根据命令片段构建自己组装的字符串,然后执行。

因此,您可以这样做:

DECLARE @mywhere VARCHAR(500)
DECLARE @mystmt VARCHAR(1000)
SET @mywhere = ' WHERE MfgPartNumber LIKE ''a%'' '
SELECT @mystmt = 'SELECT TOP 100 * FROM Products.Product AS p ' + @mywhere + ';'
EXEC( @mystmt )

但我建议您执行以下操作:

SELECT TOP 100 * 
    FROM Products.Product AS p 
    WHERE 
        ( MfgPartNumber LIKE 'a%' AND ModeMfrPartNumStartsWith=1)
    OR  ( CategoryID = 123 AND ModeCategory=1 )


 类似资料:
  • 问题内容: 我正在编写一些更新表的代码。根据用户想要执行的操作,它会更新大量的记录,也可能更新较小的记录。描绘因素是组ID。 用户可以选择是更新所有记录的表,还是仅更新具有该groupID的记录。我想对两个实例都使用相同的存储过程,也许在其中有一点逻辑来区分场景。(我不想使用90%相同的代码编写两个存储的proc。) 我不是存储过程的专家,也不知道是否可以传入可选参数,或者如何根据groupID是

  • 问题内容: 我有一个带参数的SQL Server 2005存储proc :。 我想根据此参数控制一个子句。 我想获取所有项目(不包括where子句),何时。否则,请包含where子句。 问题答案:

  • 问题内容: 我在SQL Server中创建了用户定义的表类型: 我正在使用存储过程将记录插入数据库中: 而且我想使用EF执行此存储过程,但这是问题所在:如何将用户定义的表传递给存储过程? 我尝试将存储过程添加到模型中,但是无法在更新的上下文中找到所需的存储过程。 我要执行的操作是对表执行批量插入,这是我当前正在使用的方法: 当前,我使用循环在列表中循环以将项目插入DB,但是如果列表中有很多项目,则

  • 我正在从Spring中调用一个存储过程,但是我需要向存储过程传递一个字符串数组。然而,到目前为止,我遇到了一个又一个错误。你知道哪里出了问题吗? 我尝试运行以下测试。 这是我得到的stacktrace。

  • 例如,我有一个员工列表。我想将这个列表作为一个表,并将它与另一个表连接起来。但是员工列表应该作为参数从C#传递。

  • 主要内容:示例Transact SQL 中的存储过程用于一次又一次地节省编写代码的时间。它通过将过程存储在数据库中并通过传递参数来获得所需的输出来实现这一点。 语法: 下面是存储过程创建的语法 - 参数可选:当我们创建一个过程时,一个或多个参数被传递到过程中。存储过程中有3种类型的参数: IN - 过程可以引用参数。该过程将覆盖参数的值。 OUT- 过程不能引用参数,但过程会覆盖参数值。 IN OUT- 参数被