это происходит потому, что quotename возвращает ноль, если входная строка превышает свой максимум, который составляет 128 символов.
Больше информации на:
https://docs.microsoft.com/en-us/sql/t-sql/functions/quotename-transact-sql?view=sql-server-2017
в вашем коде также не требуется для добавления приведения к каждой части, так как вы объединяете объявленную переменную varchar (max), Str, вы можете просто добавить весь контент, используя плюс, даже скобки, например так:
@Str = @Str + '['+name+']'+ CHAR(13)
В любом случае, похоже, что существует недокументированное ограничение на максимальную длину, возвращаемую из одного объекта, который можно выбрать или работающий с SQLCMD и работающий с SQL Server Management Studio в качестве клиента для выполнения SQL, вместо того, чтобы хранить все в одном Строка, вы можете получить правильный текст простым прямым выделением или, если вы используете его внутри программы, вам нужно открыть курсор и извлечь каждую строку из результирующего набора индивидуально.
Я включил точный SQL, который я использовал для проверки с аннотированными моими выводами.
USE MY_DB
DECLARE @Str AS VARCHAR(MAX)
DECLARE @Str2 AS VARCHAR(MAX)
DECLARE @Str3 AS VARCHAR(MAX)
DECLARE @Str4 AS VARCHAR(MAX)
SET @Str = ''
SET @Str2 = ''
SET @Str3 = ''
SET @Str4 = ''
SELECT
@Str = @Str + '[' + name + ']'+ CHAR(13)
FROM
sys.columns
WHERE [object_id] = OBJECT_ID('[dbo].Fact_NULLs_TEST')
/*
SELECT
@Str2 = CAST(@Str2 AS VARCHAR(MAX)) + CAST(QUOTENAME(name) AS VARCHAR(MAX)) + CAST('my short text' AS VARCHAR(MAX)) + CAST(CHAR(13) AS VARCHAR(MAX))
FROM
sys.columns
WHERE [object_id] = OBJECT_ID('[MY_DB].[dbo].Fact_NULLs_TEST')
SELECT
@Str3 = CAST(@Str3 AS VARCHAR(MAX)) + CAST(QUOTENAME(name) AS VARCHAR(MAX)) + CAST(' my long text my long text my long text my long text my long text ' AS VARCHAR(MAX)) + CAST(CHAR(13) AS VARCHAR(MAX))
FROM
sys.columns
WHERE [object_id] = OBJECT_ID('[MY_DB].[dbo].Fact_NULLs_TEST')
*/
SELECT
--top 50
@Str4 = @Str4 +
' SUM(CASE WHEN ' +'['+ sc.name +']' + ' IS NULL THEN 1 ELSE 0 END) AS ' +'[' + sc.name +'],' + CHAR(13)
FROM
sys.columns sc
WHERE [object_id] = OBJECT_ID('[dbo].Fact_NULLs_TEST')
SELECT @Str , LEN(@Str) --- 29892 chars
/*
SELECT @Str2, LEN(@Str2) ---
SELECT @Str3 , LEN(@Str3) ---
*/
SELECT @Str4 , LEN(@Str4) --- 87384 chars BUT in case you use Microsoft SQL Server Management Studio and copy /paste into an editor this is coming out truncated
PRINT @Str4 --This is truncated as well if displayed from Messages tab within Microsoft SQL Server Management Studio or grabbed by using SQLCMD
--with -o on a text file, i.e. SQLCMD -S dbserver -E -i c:\temp\test1.sql -o c:\temp\test1out.txt
SELECT
' SUM(CASE WHEN ' +'['+ sc.name +']' + ' IS NULL THEN 1 ELSE 0 END) AS ' +'[' + sc.name +'],'
FROM
sys.columns sc
WHERE [object_id] = OBJECT_ID('[dbo].Fact_NULLs_TEST')
--This last select works fine either from Microsoft SQL Server Management Studio or by using SQLCMD