Я не думаю, что вы можете сделать это с помощью T-SQL, НО вы абсолютно можете сделать то же самое с помощью UDF, написанного на C #.Вот код:
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, вам необходимо убедиться, что вы включили их на сервере следующим образом:
exec sp_configure 'clr enabled', 1
RECONFIGURE
Вам также необходимо скомпилироватьв более старую версию .NET Framework (2.0 - это то, что я тестировал), так как SQL 2005 не допускает сборки 4.0.
Даже если ваш UDF написан на C #, вы все равно получаете к нему доступ через T-SQLтак же, как вы привыкли:
select fn_HearingAttendeesToCSV('table', 'column')
Если вам нужно поддерживать схемы, отличные от 'dbo', или если вам не нужен чистый CSV, измените его в соответствии со своими потребностями, но это должно помочь вам99% пути туда.То есть, если вы являетесь администратором баз данных или у вас достаточно хороших друзей, чтобы включить CLR.