2017-03-06 60 views
1

我有一個獨特的情況,我需要連接基於2組的行。另一個技巧是串聯必須能夠顯示項目符號並添加換行符。這是我的業務要求。我還應該添加最終目標將是Excel。我已經使用包含項目符號和換行符的數據測試了使用SSIS導出到Excel,並且此部分工作正常。如何在SQL Server中連接unicode字符串?

如何去從:

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 
+3

本應在表示層來完成,而不是在數據庫級別 – Lamak

+0

我同意@拉瑪克在這裏。企業可能會要求它看起來像這樣,你需要提供。但數據庫應該將數據返回給您的應用程序,然後對其進行格式化。 –

+0

我同意你們兩人的看法,這也是我最初的迴應。但是,公司內部可用的當前工具和安全級別要求這樣做。我知道這是可以做到的,這只是一個問題。我還應該添加最終目標將是Excel。我已經使用包含項目符號和換行符的數據測試了使用SSIS導出到Excel,並且此部分工作正常。 –

回答

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] 
+0

是的,這個作品也是 – Lamak

+0

非常感謝@SqlZim。我用我的表名替換了兩個表。它是否正確?我得到這個錯誤'FOR XML無法序列化節點'NoName'的數據,因爲它包含了XML中不允許的字符(0x0007)。要使用FOR XML檢索此數據,請將其轉換爲二進制,varbinary或圖像數據類型,並使用BINARY BASE64指令' –

+0

@ B.C。您可以用一個臨時字符串替換它,並在'for xml'後替換它。我用這個解決方法更新了答案。 - 或者只是將其移除,如下所示:http://dba.stackexchange.com/q/107238/43889 – SqlZim