Mssql 2005 的 group_concat
今天要解決個問題,就是實現一個MSSQL類似于mysql group_concat那樣的函數,我是通過自定義聚合函數的方法實現的。
MSSQL 2005 Express
創建一個C#的數據庫項目,添加一個聚合group_concat.cs,寫入如下代碼
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Text;
[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.UserDefined,
IsInvariantToDuplicates = false,
IsInvariantToNulls = true,
IsInvariantToOrder = false,
IsNullIfEmpty = true,
MaxByteSize = 8000
)]
public struct group_concat : IBinarySerialize
{
private StringBuilder _result;
public void Init()
{
_result = new StringBuilder();
}
public void Accumulate(SqlString Value)
{
if (Value.IsNull) return;
if (_result.Length > 0) _result.Append(",");
_result.Append(Value.Value);
}
public void Merge(group_concat Group)
{
_result.Append(Group._result);
}
public SqlString Terminate()
{
if (_result.Length > 0)
return new SqlString(_result.ToString());
return new SqlString("");
}
#region IBinarySerialize Members
public void Read(System.IO.BinaryReader r)
{
this._result = new StringBuilder(r.ReadString());
}
public void Write(System.IO.BinaryWriter w)
{
w.Write(this._result.ToString());
}
#endregion
}
生成group_concat.dll,然后按照它:
需要開啟 SQL Server 2005 對 CLR 的支持(如果沒有打開的話)。
執行如下命令:
EXEC sp_configure clr enabled, 1
RECONFIGURE WITH OVERRIDE
SQL Server 2005 必須設置兼容性級別為 "SQL Server 2005(90)",
exec sp_dbcmptlevel '數據庫名',90
注冊程序集合
CREATE ASSEMBLY group_concat FROM 'F:\c#實驗\group_concat\group_concat\bin\Release\group_concat.dll'
注冊聚合函數
CREATE AGGREGATE group_concat(@input nvarchar(2000)) RETURNS nvarchar(max) EXTERNAL NAME group_concat
后來在CSDN上面,又找到個解決方案,個人認為這個解決方案很牛X,呵呵,就記錄一下:
-- 示例數據
DECLARE@tTABLE(id int, value varchar(10))
INSERT@tSELECT1, 'aa'
UNIONALLSELECT1, 'bb'
UNIONALLSELECT2, 'aaa'
UNIONALLSELECT2, 'bbb'
UNIONALLSELECT2, 'ccc'
-- 查詢處理
SELECT*
FROM(
SELECTDISTINCT
id
FROM@t
)A
OUTER APPLY(
SELECT
[values]=STUFF(REPLACE(REPLACE(
(
SELECT value FROM@t N
WHERE id = A.id
FOR XML AUTO
), '<N value="', ','), '"/>', ''), 1, 1, '')
)N
/*--結果
id values
----------- ----------------
1 aa,bb
2 aaa,bbb,ccc
(2 行受影響)
--*/
關健詞:Mssql
新文章:
- CentOS7下圖形配置網絡的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統后丟失windows啟動項
- CentOS單網卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網打印機IP講解
- CentOS7使用hostapd實現無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網絡重啟出錯
- 解決Centos7雙系統后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統有什么不同呢
- Centos 6.6默認iptable規則詳解