【问题标题】:While using SP_ExecuteSQL I'm generating a boolean error在使用 SP_ExecuteSQL 时,我正在生成一个布尔错误
【发布时间】:2013-03-20 15:22:22
【问题描述】:

我对 SQL 很陌生,所以如果我的问题显得微不足道,或者我似乎还没有完成我的工作,请先道歉。我正在努力学习如何掌握很多这些概念。

无论如何,我正在编写一个复杂的查询,该查询最终会采用许多参数。对于这些参数,我将使用逗号分隔的字符串来允许多个变量。 (我之前已经解决了这个问题,但在尝试执行 SP_ExecuteSQL 时没有解决。

话虽如此,这里是查询的基本内容。

DECLARE @system_status varchar(30)
SELECT @system_status = '12,14'

DECLARE @sql nvarchar(4000)


SELECT @sql = 'SELECT  [system_status]
  FROM VW_Document_Main      
  WHERE 1=1 ' 

IF @System_Status =  '-1'      
      Begin      
            SELECT @sql = @sql + 'and system_status <> 20'      
      End      
ELSE IF @system_status IS NOT NULL AND @system_status NOT IN ('-1','0')      
      Begin     
            SELECT @sql = @sql + 'and ' + @system_Status + ' LIKE ''%,'' + system_Status + '',%'''

当我没有将它构建到 sp_executesql 语句中时,我能够填充一个可用的查询,但是,由于我将构建这个查询,因此有必要采取这些步骤......关于我为什么生成的任何想法非布尔错误?

编辑:不确定这是否是朝着正确方向迈出的一步,但现在在修改最终的 SELECT 语句后:

SELECT @sql = @sql + 'and '',''' + @system_Status + '','''  LIKE ''%,' + 'system_Status' + ',%'''

它给了我一个不同的错误:为变量赋值的 SELECT 语句不能与数据检索操作结合使用。

值得注意的是,错误显示为:在预期条件的上下文中指定的非布尔类型的表达式,靠近 ','。

【问题讨论】:

  • @system_status 是一个 varchar,但你有 'and system_status 20' 没有 20 左右的单引号。我不知道这是否是你唯一的问题,但你需要纠正它。跨度>

标签: sql sql-server dynamic boolean concatenation


【解决方案1】:

您正在将文字 @system_status 值 '12, 14' 插入到最终 SQL 中,因此它看起来像这样

SELECT [system_status] FROM VW_Document_Main WHERE 1=1 and 12,14 LIKE '%,' + system_Status + ',%'

这将失败,因为您没有 12,14 引号。所以你必须修改该行

SELECT @system_status = '12,14'

成为

SELECT @system_status = '''12,14'''

另外,既然你说你是通过 sp_executeSql 运行它,你应该将你的最后一个选择修改为

SELECT @sql = @sql + 'and  @system_Status LIKE ''%,'' + system_Status + '',%'''

并将您的执行 SQL 过程更改为

sp_executesql @sql, N'@system_status varchar(30)', @system_status

【讨论】:

  • 它正在运行查询,没有任何错误,但仍然影响 0 行。即使我只使用一个变量.. 嗯
  • 当您运行 SELECT [system_status] FROM VW_Document_Main where system_status like '%,12,14,%' 时肯定会返回一行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 2019-03-16
  • 2018-03-29
  • 2012-08-18
  • 1970-01-01
  • 2015-06-28
相关资源
最近更新 更多