【发布时间】:2018-05-08 23:43:55
【问题描述】:
我正在尝试通过将字符串连接成 varchar max 来生成列名列表,以用于动态查询。我一直使用的方法一直运行良好,直到我遇到一个超过 500 列的表。对于大表,当我将额外的字符串添加到列以生成 sql 选择脚本时,我的列列表被截断。 如果有人能向我指出为什么我的最后 4 个选择(如下)并非全部产生 600 行(当该字段被复制到新的查询窗口时,该字段包含换行符),我将非常感激。 Varchar(max) 应该足够大以产生我想要的结果。我只是无法弄清楚为什么会发生截断。
--CREATE TABLE [dbo].[Fact_NULLs_TEST]
--(
--My_really_quite_quite_quite_long_Column_name1 DECIMAL(18,2) NULL,
--My_really_quite_quite_quite_long_Column_name2 DECIMAL(18,2) NULL,
--My_really_quite_quite_quite_long_Column_name3 DECIMAL(18,2) NULL,
--My_really_quite_quite_quite_long_Column_name4 DECIMAL(18,2) NULL,
--My_really_quite_quite_quite_long_Column_name5 DECIMAL(18,2) NULL,
--My_really_quite_quite_quite_long_Column_name6 DECIMAL(18,2) NULL,
--My_really_quite_quite_quite_long_Column_name7 DECIMAL(18,2) NULL,
--My_really_quite_quite_quite_long_Column_name8 DECIMAL(18,2) NULL,
--My_really_quite_quite_quite_long_Column_name9 DECIMAL(18,2) NULL,
---- ......... etc up to My_really_quite_quite_quite_long_Column_name600
--)
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 + CAST(QUOTENAME(name) AS VARCHAR(MAX)) + CAST(CHAR(13) AS VARCHAR(MAX))
FROM
MY_DB.sys.columns
WHERE [object_id] = OBJECT_ID('[MY_DB].[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
MY_DB.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
MY_DB.sys.columns
WHERE [object_id] = OBJECT_ID('[MY_DB].[dbo].Fact_NULLs_TEST')
SELECT
@Str4 = CAST(@Str4 AS VARCHAR(MAX)) + CAST('SUM(CASE WHEN ' AS VARCHAR(MAX)) + CAST(QUOTENAME(name) AS VARCHAR(MAX)) + CAST(' IS NULL THEN 1 ELSE 0 END) AS ' AS VARCHAR(MAX)) + CAST(QUOTENAME(name) AS VARCHAR(MAX)) + CAST(',' AS VARCHAR(MAX)) + CAST(CHAR(13) AS VARCHAR(MAX))
FROM
MY_DB.sys.columns
WHERE [object_id] = OBJECT_ID('[MY_DB].[dbo].Fact_NULLs_TEST')
SELECT @Str , LEN(@Str) --- 600 rows
SELECT @Str2, LEN(@Str2) --- 600 rows
SELECT @Str3 , LEN(@Str3) --- 378 rows ??????????????????
SELECT @Str4 , LEN(@Str4) --- 303 rows ??????????????????
【问题讨论】:
-
是的,不是我的设计。这是我被赋予的工作。
标签: tsql sql-server-2012