【问题标题】:Appending messages in a variable using COALESCE function使用 COALESCE 函数在变量中附加消息
【发布时间】:2016-06-06 06:51:03
【问题描述】:

下面是我的代码。

DECLARE @msg NVARCHAR(MAX) = NULL

;WITH CTE AS (
                    SELECT 'A' AS Message
                UNION
                    SELECT 'B' AS Message
                UNION
                    SELECT 'C' AS Message
                UNION
                    SELECT 'D' AS Message
)

SELECT @msg = COALESCE(ISNULL(@msg,'Attachements') + ', ','') +  Message FROM CTE

SELECT @msg + ' are missing.'

它正在生成输出:-

Attachments, A, B, C, D are missing.

如何避免单词 "Attachments" 后面的第一个逗号?请帮忙。

也欢迎其他满足要求的技术。

谢谢。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    不要使用undocumented/unsupported way of concatenating strings,而是使用FOR XML PATH

    DECLARE @msg NVARCHAR(MAX) = NULL
    
    ;WITH CTE AS (
        SELECT 'A' AS Message
        UNION
        SELECT 'B' AS Message
        UNION
        SELECT 'C' AS Message
        UNION
        SELECT 'D' AS Message
    )
    
    SELECT @msg = 'Attachments ' + 
        STUFF((
            SELECT ', ' + Message 
            FROM CTE
            ORDER BY Message
            FOR XML PATH(''), TYPE).value('.[1]', 'NVARCHAR(MAX)')
        , 1, 2, ' ')
    
    SELECT @msg + ' are missing.'
    

    【讨论】:

    • 会考虑性能。虽然我有点理解它:( +1
    • 还有什么“TYPE).value('.[1]', 'NVARCHAR(MAX)')”?奇怪,我在选择代码中使用了数据类型!!
    【解决方案2】:

    试试这个:

    SELECT @msg = ISNULL(@msg + ', ', 'Attachements ') +  Message FROM CTE
    

    并查看FOR XML 连接字符串的方法

    【讨论】:

    • 感谢您让事情变得简单。 +1 为简单起见 :)
    【解决方案3】:

    用例当

    SELECT @msg = case when @msg is NULL then 'Attachment ' 
    else
    COALESCE(@msg + ', ','') 
    end
    + Message FROM CTE
    SELECT @msg + ' are missing.'
    

    【讨论】:

    • 我没有想过在我的代码中包含 CASE。 :(谢谢+1
    【解决方案4】:

    只需更改最后两行

    SELECT @msg = COALESCE(@Msg + ', ','') +  Message FROM CTE
    
    SELECT 'Attachments '+@msg + ' are missing.'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多