我试图创建一个简单的表值CLR函数,它以逗号分隔的字符串作为参数,将其拆分并将其作为多行返回
在完成一些在线教程之后,我最终得到了:
[SqlFunction(FillRowMethodName = "FillRow",TableDefinition="val nvarchar(1000)")]
public static IEnumerable SqlFunction1(SqlString val)
{
string[] splitStr = val.Value.Split(',');
return splitStr;
}
private static void FillRow(Object obj, out SqlString str)
{
object[] row = (object[])obj;
str = (string)row[0];
}
但是,使用
执行它select * from dbo.SqlFunction1('1,2,3,4,5')
返回以下错误
Msg 6260, Level 16, State 1, Line 1
An error occurred while getting new row from user defined Table Valued Function :
System.InvalidCastException: Unable to cast object of type 'System.String' to type 'System.Object[]'.
System.InvalidCastException:
at UserDefinedFunctions.FillRow(Object obj, SqlString& str)
.
答案 0 :(得分:3)
您正在使用字符串引用并尝试将其强制转换为对象数组,这会导致InvalidCastException。
您的SqlFunction1
方法返回一个字符串数组,因此将使用字符串引用调用FillRow
方法。将对象引用转换回字符串,然后从中创建SqlString
值:
private static void FillRow(Object obj, out SqlString str) {
string row = (string)obj;
str = new SqlString(row);
}
答案 1 :(得分:2)
我没有C#专家,我是一名SQL开发人员,但这段代码过去对我有用。该方法也接受参数化分隔符。 对不起,我无法直接回答你的问题。 我甚至不能给你一个消息来源,并且信用该代码的原始作者 - 足以说它不是我。
using System;
using System.Data;
using System.Collections;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class UserDefinedFunctions
{
[SqlFunction(Name = "StringParserCLR",
FillRowMethodName = "FillRow",
TableDefinition = "string nvarchar(500)")]
public static IEnumerable StringParserCLR(SqlString str, SqlChars delimiter)
{
if (delimiter.Length == 0)
{
return new string[1] { str.Value };
}
return str.Value.Split(delimiter[0]);
}
public static void FillRow(object row, out SqlString str)
{
str = new SqlString((string)row);
}
};