亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Microsoft SQL Server 2005中模擬group_concat MySQL函數?

在Microsoft SQL Server 2005中模擬group_concat MySQL函數?

Smart貓小萌 2019-05-21 13:30:47
在Microsoft SQL Server 2005中模擬group_concat MySQL函數?我正在嘗試將基于MySQL的應用程序遷移到Microsoft SQL Server 2005(不是選擇,而是生活)。在原始應用程序中,我們幾乎完全使用符合ANSI-SQL的語句,但有一個重要的例外 - 我們使用MySQL的group_concat功能相當頻繁。group_concat順便說一句,這樣做:給出一張表,比如說,員工姓名和項目......SELECT empName, projID FROM project_members;收益:ANDY   |  A100ANDY   |  B391ANDY   |  X010TOM    |  A100TOM    |  A510...這是你用group_concat得到的:SELECT     empName, group_concat(projID SEPARATOR ' / ') FROM     project_members GROUP BY     empName;收益:ANDY   |  A100 / B391 / X010TOM    |  A100 / A510所以我想知道的是:是否有可能在SQL Server中編寫用戶定義的函數來模擬其功能group_concat?我幾乎沒有使用UDF,存儲過程或類似的東西的經驗,只是直接的SQL,所以請錯誤地說太多的解釋:)
查看完整描述

5 回答

?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

沒有真正簡單的方法來做到這一點。不過,那里有很多想法。

我找到的最好的一個

SELECT table_name, LEFT(column_names , LEN(column_names )-1) AS column_names

FROM information_schema.columns AS extern

CROSS APPLY

(

    SELECT column_name + ','

    FROM information_schema.columns AS intern

    WHERE extern.table_name = intern.table_name

    FOR XML PATH('')

) pre_trimmed (column_names)

GROUP BY table_name, column_names;

或者,如果數據可能包含諸如的字符,則該版本可正常工作 <


WITH extern

     AS (SELECT DISTINCT table_name

         FROM   INFORMATION_SCHEMA.COLUMNS)

SELECT table_name,

       LEFT(y.column_names, LEN(y.column_names) - 1) AS column_names

FROM   extern

       CROSS APPLY (SELECT column_name + ','

                    FROM   INFORMATION_SCHEMA.COLUMNS AS intern

                    WHERE  extern.table_name = intern.table_name

                    FOR XML PATH(''), TYPE) x (column_names)

       CROSS APPLY (SELECT x.column_names.value('.', 'NVARCHAR(MAX)')) y(column_names)


查看完整回答
反對 回復 2019-05-21
?
慕少森

TA貢獻2019條經驗 獲得超9個贊

我可能會晚一點,但這種方法適合我,比COALESCE方法更容易。

SELECT STUFF(
             (SELECT ',' + Column_Name 
              FROM Table_Name              FOR XML PATH (''))
             , 1, 1, '')


查看完整回答
反對 回復 2019-05-21
?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊


現在可能為時已晚,但這不是最簡單的做事方式嗎?


SELECT     empName, projIDs = replace

                          ((SELECT Surname AS [data()]

                              FROM project_members

                              WHERE  empName = a.empName

                              ORDER BY empName FOR xml path('')), ' ', REQUIRED SEPERATOR)

FROM         project_members a

WHERE     empName IS NOT NULL

GROUP BY empName


查看完整回答
反對 回復 2019-05-21
?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

SQL Server 2017確實引入了新的聚合函數

STRING_AGG ( expression, separator)。

連接字符串表達式的值并在它們之間放置分隔符值。字符串末尾不添加分隔符。

可以通過附加來排序連接元素 WITHIN GROUP (ORDER BY some_expression)

對于2005-2016版本,我通常在接受的答案中使用XML方法。

然而,在某些情況下這可能會失敗。例如,如果要連接的數據包含CHAR(29)您看到的內容

FOR XML無法序列化數據...因為它包含XML中不允許的字符(0x001D)。

可以處理所有字符的更健壯的方法是使用CLR聚合。然而,使用這種方法對連接元素應用排序更加困難。

分配給變量的方法不能保證,應該在生產代碼中避免。


查看完整回答
反對 回復 2019-05-21
?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

看看Github 上的GROUP_CONCAT項目,我想我的確是你正在尋找的:

該項目包含一組SQLCLR用戶定義聚合函數(SQLCLR UDA),它們共同提供與MySQL GROUP_CONCAT函數類似的功能。根據所需功能,有多種功能可確保最佳性能......


查看完整回答
反對 回復 2019-05-21
  • 5 回答
  • 0 關注
  • 1441 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號