传递多表名至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生成代码
原代码还有两个潜在问题,建议一起修复:
- 修正STUFF参数:
' UNION ALL '是11个字符,原代码中STUFF(...,1,10,'')未完全删除前缀空格,应改为1,11,''。 - 包裹特殊字符:对表名和列名添加方括号
[],避免因特殊字符/保留字导致语法错误。
优化后的完整代码:
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
相关产品推荐
相关产品推荐

