超过 130 的字符长度不显示在列中

Character length over 130 does not show in column

我有很多问题来自我用于数据透视的调查 table。要使用 stufffor xml path 动态地将所有问题收集到我的数据透视表中。但是,似乎没有显示长度 > 130 的问题文本。

而且我可以 select 我的 cte Questions 中的所有列,所以我知道数据在那里。

UPDATE: If I select my output, my total length is around 8.000 could it be something about the nvarchar(max) not storing more than 8.000 even though it should be able to store around 2gb?

我做错了什么?

SELECT QuestionList = cast(STUFF((
                SELECT ',' + QUOTENAME(cast(question AS NVARCHAR(max)))
                FROM questions
                ORDER BY [AgpdbQuestionID]
                FOR XML PATH('')
                ), 1, 1, '') AS NVARCHAR(max))

这是因为 QUOTENAME,如果输入大于 128,它 returns NULL 因为它应该处理 sysname,而不是 (N)VARCHAR: "character_string is sysname and is limited to 128 characters. Inputs greater than 128 characters return NULL."

改为尝试:

SELECT QuestionList = cast(STUFF((
                SELECT ',' + '[' + (cast(question AS NVARCHAR(max)) + ']')
                FROM (
                        VALUES (REPLICATE('a', 130)) 
                     )q(question)
                FOR XML PATH('')
                ), 1, 1, '') AS NVARCHAR(max))

作为实现此目的的另一种方式。此方法在不使用 XML 的情况下实现相同的效果,因此您不受某些字符的限制。它遍历你的 table,用每一行构建字符串,最后一个实例被设置为你的变量 @QuestionList.

Declare @QuestionList AS NVARCHAR(max)

SELECT 
    @QuestionList = isnull(@QuestionList + ', ', '') + question
FROM
    questions
ORDER BY 
    AgpdbQuestionID

使用 isnull 很重要,因为这样可以在现有字符串为空时省略第一个逗号。

我很想知道这与 XML 方法相比有多有效,但是当我需要像 >, <, " and '[=13= 这样的 ceratin 字符时,这对我自己很有用]