You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传递多表名至SQL查询时遇非布尔类型表达式错误求解决

问题解决建议

核心错误原因

你遇到的错误是因为多表名传入方式不符合SQL语法要求:

  • 若你通过变量传入逗号分隔的表名字符串(如@TableNames = 'table1,table2'),直接写WHERE TABLE_NAME IN (@TableNames)会让SQL把整个字符串当成单个值匹配,而非多个独立表名,从而触发非布尔表达式错误。
  • 若你硬编码多表名,可能存在语法遗漏(比如表名未用单引号包裹、逗号格式错误)。

具体修复方案

方案1:硬编码多表名(直接指定)

确保IN子句中每个表名都用单引号包裹、逗号分隔:

WHERE TABLE_NAME IN ('table1', 'table2', 'table3')

方案2:动态传入多表名(变量方式)

如果需要通过变量传递多表名,针对SQL Server 2016+版本,使用STRING_SPLIT函数拆分字符串:

-- 定义多表名字符串变量
DECLARE @TableNameList NVARCHAR(MAX) = 'table1,table2,table3'

-- 修改WHERE条件
WHERE TABLE_NAME IN (SELECT value FROM STRING_SPLIT(@TableNameList, ','))

方案3:优化你的动态SQL生成代码

原代码还有两个潜在问题,建议一起修复:

  1. 修正STUFF参数:' UNION ALL '是11个字符,原代码中STUFF(...,1,10,'')未完全删除前缀空格,应改为1,11,''。
  2. 包裹特殊字符:对表名和列名添加方括号[],避免因特殊字符/保留字导致语法错误。

优化后的完整代码:

DECLARE @Sql NVARCHAR(MAX)

SELECT @Sql = STUFF((
    SELECT ' UNION ALL ' + 
           'SELECT ''' + TABLE_NAME + ''' AS TABLE_NAME,' +
           '''' + COLUMN_NAME + ''' AS ColumnName,' +
           'SUM(CASE WHEN [' + COLUMN_NAME + '] IS NULL THEN 1 ELSE 0 END) AS CountOfNulls,' +
           'COUNT([' + COLUMN_NAME + ']) AS Count,' +
           'COUNT(DISTINCT [' + COLUMN_NAME + ']) AS CountDistinct ' +
           'FROM [' + TABLE_NAME + ']'
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME IN ('table1', 'table2') -- 这里替换为你的多表名条件
    FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 11, '')

EXEC (@Sql)

内容的提问来源于stack exchange,提问作者Fatima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 13:05:19