4

我对用于数据透视表的调查有很多问题。stuff使用和动态收集所有问题到我的支点for xml path。但是,似乎没有显示长度 > 130 的问题文本。

我可以从我的 中选择所有列cte Questions,所以我知道数据在那里。

更新:如果我选择我的输出,我的总长度大约是 8.000,这可能是关于 nvarchar(max) 不存储超过 8.000 的问题,即使它应该能够存储大约 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))
4

2 回答 2

5

这是因为QUOTENAME,如果输入大于 128 它返回 NULL 因为它应该处理sysname,而不是(N)VARCHAR:“character_string 是 sysname 并且限制为 128 个字符。大于 128 个字符的输入返回 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))
于 2019-08-22T08:55:35.443 回答
0

就像实现这一目标的另一种方式一样。此方法在不使用 XML 的情况下实现相同的目的,因此您不受限于某些字符。它遍历您的表,为每一行构建字符串,最后一个实例设置为您的变量@QuestionList

Declare @QuestionList AS NVARCHAR(max)

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

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

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

于 2019-08-22T10:17:34.687 回答