【问题标题】:Character length over 130 does not show in column超过 130 的字符长度不显示在列中
【发布时间】:2019-08-22 08:47:04
【问题描述】:

我有很多问题来自我用于数据透视表的调查。使用stufffor 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))

【问题讨论】:

    标签: sql-server tsql for-xml-path azure-sql-data-warehouse


    【解决方案1】:

    这是因为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))
    

    【讨论】:

    • 啊-谢谢,如果有任何限制,我正在研究这些东西和 XML。没想到 QOUTENAME :)
    • 我自己最近也遇到了类似的问题,确实需要一些挖掘才能找到原因。
    • 如果你想适当地复制QUOTENAME的功能,我推荐'[' + REPLACE((cast(question AS NVARCHAR(max)),']',']]') + ']'
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-03
      相关资源
      最近更新 更多