动态SQL字符串返回NULL

时间:2015-06-04 20:34:20

标签: sql-server sql-server-2008-r2 dynamic-sql

我正在尝试构造一个动态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 );

我的问题是print语句没有返回任何我认为是因为@user_script变量为NULL的内容。

要评估我的表是否实际返回结果,我运行此查询(上述查询的完全副本,而不将其分配给变量),此查询返回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(),用实际空格替换SPCACE(),但我遇到了同样的问题。

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

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

尝试添加

SET @user_script = '' 

之前的行上

select @user_script += ....

答案 1 :(得分:0)

您可以使用

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