【问题标题】:How to concatenate unicode strings in SQL Server?如何在 SQL Server 中连接 unicode 字符串?
【发布时间】:2017-07-26 21:21:51
【问题描述】:

我有一个独特的情况,我需要基于 2 个组连接行。另一个技巧是串联必须能够显示项目符号并添加换行符。这是我的企业所要求的。我还应该添加最终目的地将是 Excel。我已经使用带有项目符号和换行符的数据测试了通过 SSIS 导出到 Excel,这部分确实有效。

如何去:

pk   orgnl_pk   type   text
1    1          one    • Line One
2    1          one    • Line Two
3    1          one    • Line Three
4    1          two    • Line One
7    3          one    • Line One
8    3          two    • Line One
9    3          two    • Line Two

收件人:

orgnl_pk    type    text
1           one     • Line One
                    • Line Two
                    • Line Three
1           two     • Line One
3           one     • Line One
3           two     • Line One
                    • Line Two

【问题讨论】:

  • 这应该在表示层完成,而不是在数据库级别
  • 我在这里同意@Lamak。企业可能要求它看起来像那样,而您需要提供它。但是数据库应该将数据返回给您的应用程序,然后您对其进行格式化。
  • 我同意你们两个,这也是我最初的回应。但是,公司内部可用的当前工具和安全级别要求这样做。我知道这是可以做到的,只是方法的问题。我还应该添加最终目的地将是 Excel。我已经使用带有项目符号和换行符的数据测试了通过 SSIS 导出到 Excel,这部分确实有效。

标签: sql sql-server unicode string-concatenation


【解决方案1】:

正如 Lamak 所指出的,这最好留给表示层,但如果您现在必须在 sql 中执行...那么这将使用 stuff() with select ... for xml path ('') method of string concatenation

select 
    orgnl_pk
  , [type]
  , [text]=stuff(
        (
        select char(10) +i.[text]
          from t as i
          where i.orgnl_pk = t.orgnl_pk
            and i.[type]=t.[type]
          order by i.pk 
        for xml path (''), type).value('.','nvarchar(max)')
        ,1,0,'')
from t
group by orgnl_pk, [type]

rextester 演示:http://rextester.com/GPFIMO37322

返回:

+----------+------+--------------+
| orgnl_pk | type |     text     |
+----------+------+--------------+
|        1 | one  | • Line One   |
|          |      | • Line Two   |
|          |      | • Line Three |
|        1 | two  | • Line One   |
|        3 | one  | • Line One   |
|        3 | two  | • Line One   |
|          |      | • Line Two   |
+----------+------+--------------+


字符更新(0x0007):
select 
    orgnl_pk
  , [type]
  , [text]=replace(stuff(
        (
        select char(10)+replace(i.[text],nchar(0x0007),'$BEL$')
          from t as i
          where i.orgnl_pk = t.orgnl_pk
            and i.[type]=t.[type]
          order by i.pk 
        for xml path (''), type).value('.','nvarchar(max)')
        ,1,1,''),'$BEL$',nchar(0x0007))
from t
group by orgnl_pk, [type]

【讨论】:

  • 非常感谢@SqlZim。我用我的表名替换了两个 t 表。它是否正确?我收到此错误“FOR XML 无法序列化节点“NoName”的数据,因为它包含 XML 中不允许的字符 (0x0007)。要使用 FOR XML 检索此数据,请将其转换为二进制、varbinary 或图像数据类型并使用 BINARY BASE64 指令'
  • @B.C.您可以将其替换为临时字符串并在for xml 之后将其替换回来。我用解决方法更新了答案。 -- 或者只是删除它,如下所示:dba.stackexchange.com/q/107238/43889
  • 感谢@SqlZim!我真的很喜欢将它替换为临时字符串的想法。这太棒了!
  • @B.C.乐于助人!
猜你喜欢
  • 1970-01-01
  • 2021-03-15
  • 2013-03-15
  • 2011-07-18
  • 2017-05-11
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多