动态 SQL 字符串 returns NULL

Dynamic SQL string returns NULL

我正在尝试构建一个动态的 SQL 语句,但由于某种原因它没有返回预期的结果。 这是我的查询

DECLARE @user_script AS VARCHAR(MAX);



SELECT  @user_script += 'IF NOT EXISTS (SELECT [name] FROM sys.database_principals WHERE [name] = '
        + SPACE(1) + '''' + [name] + '''' + ') BEGIN CREATE USER ' + SPACE(1)
        + QUOTENAME([name]) + ' FOR LOGIN ' + QUOTENAME([name])
        + ' WITH DEFAULT_SCHEMA = ' + QUOTENAME([default_schema_name])
        + SPACE(1) + 'END; '
FROM    sys.database_principals AS rm
WHERE   [type] IN ( 'U', 'S', 'G' )
        AND rm.default_schema_name IS NOT NULL;
PRINT ( @user_script );

我的问题是打印语句没有返回任何东西,我认为这是因为 @user_script 变量是 NULL

为了评估我的 table 是否真的返回结果,我 运行 这个查询(上面查询的精确副本,没有将它分配给变量)和这个查询 returns 10 行

SELECT 'IF NOT EXISTS (SELECT [name] FROM sys.database_principals WHERE [name] = '
        + SPACE(1) + '''' + [name] + '''' + ') BEGIN CREATE USER ' + SPACE(1)
        + QUOTENAME([name]) + ' FOR LOGIN ' + QUOTENAME([name])
        + ' WITH DEFAULT_SCHEMA = ' + QUOTENAME([default_schema_name])
        + SPACE(1) + 'END; '
FROM    sys.database_principals AS rm
WHERE   [type] IN ( 'U', 'S', 'G' )
        AND rm.default_schema_name IS NOT NULL;

我尝试用引号替换函数 QUOTENAME(),用实际的 space 替换 SPCACE(),但我遇到了同样的问题。

我终于检查了第二个查询的返回结果是否是 NULL。但是 none 行是 NULL

感谢您的帮助

您可以用

开始 select
SELECT  @user_script =  ISNULL(@user_script, '') + ...

试着放一个

SET @user_script = '' 

在您

之前的那一行
select @user_script += ....