首页 > 解决方案 > SELECT INTO 语句不能包含将值分配给变量的 SELECT 语句

问题描述

我正在尝试创建一个存储过程或函数来查找表中每列中空值的数量。

我在确定将代码转换为存储过程/函数的语法时遇到问题。

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = (
    SELECT '
    ' +
    STUFF((
        SELECT ', [' + c.name + '] = ' + CASE WHEN c.is_nullable = 0 THEN '0' ELSE 'COUNT(*) - COUNT([' + c.name + '])' END
        FROM sys.columns c
        WHERE c.[object_id] = o.[object_id]
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, 'SELECT ''' + SCHEMA_NAME(o.[schema_id]) + '.' + o.name + ''', COUNT(*), ') + '
    FROM [' + SCHEMA_NAME(o.[schema_id]) + '].[' + o.name + ']'
    FROM sys.objects o
    WHERE o.[type] = 'U'
        AND o.is_ms_shipped = 0
        AND [name] = 'BSEG'
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
INTO xzy
PRINT @SQL
EXEC sys.sp_executesql @SQL

我想将结果存储在表格中。但我收到以下错误消息:

Msg 194, Level 15, State 1, Line 2
A SELECT INTO statement cannot contain a SELECT statement that assigns values to a variable.

所以我的最终目标是拥有一个存储过程/函数,它在执行时会在表的每一列中给出空值的数量,结果将存储在另一个结果表中。

标签: sqlsql-server

解决方案


您能否检查以下更改-

从查询中删除分配部分,只需使用简单的选择语句作为 -

SELECT '' +
STUFF((
...

--Note: Write the SQL in such way so that only SQL 
--text from STUFF functions is returned. There is no 
--requirement of assigning the text first to variable @SQL

在 INTO 键之前添加 INSERT,如下所示 -

...
INSERT INTO xzy
...

如果仍然没有成功,请提供 PRINT @SQL 命令的输出,并进行上述 2 处更改。


推荐阅读