0

我对 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 语句不能与数据检索操作结合使用。

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

4

1 回答 1

0

您将文字 @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
于 2013-03-20T15:45:28.960 回答