我不认为你可以通过 T-SQL 做到这一点,但你绝对可以通过用 C# 编写的 UDF 完成同样的事情。这是代码:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class UserDefinedFunctions {
[Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
public static SqlString fn_HearingAttendeesToCSV(SqlString tableName, SqlString columnName) {
System.Text.StringBuilder result = null;
using (var cnn = new SqlConnection("context connection=true")) {
var cmd = new SqlCommand();
cmd.CommandText = String.Format("select [{0}] from [{1}]", SqlEscape(columnName.Value), SqlEscape(tableName.Value));
cmd.Connection = cnn;
cnn.Open();
using (var rdr = cmd.ExecuteReader()) {
while (rdr.Read()) {
if (result == null) {
result = new System.Text.StringBuilder();
}
else {
result.Append(",");
}
result.Append(CsvEscape(rdr[0]));
}
}
cnn.Close();
}
if (result == null) {
return SqlString.Null;
}
else {
return result.ToString();
}
}
private static string SqlEscape(string s) {
s = s ?? "";
return s.Replace("[", "[[").Replace("]", "]]");
}
private static string CsvEscape(object o) {
var s = o == null ? "" : o.ToString();
return "\"" + s.Replace("\"", "\"\"") + "\"";
}
};
为了使用 CLR UDF,您需要确保已在服务器上启用它们,如下所示:
exec sp_configure 'clr enabled', 1
RECONFIGURE
您还需要编译为旧版本的 .NET 框架(我测试的是 2.0),因为 SQL 2005 不允许 4.0 程序集。
即使您的 UDF 是用 C# 编写的,您仍然可以像以前一样通过 T-SQL 访问它:
select fn_HearingAttendeesToCSV('table', 'column')
如果您需要支持“dbo”以外的模式,或者如果您不需要纯 CSV,请进行修改以满足您的需求,但这应该可以让您完成 99% 的工作。也就是说,假设您是 DBA,或者您是他/她的好伙伴,可以启用 CLR。