我已将之前在 SQL 中定义的 split 函数转换为 C#。现在,当我尝试转换调用 split 函数的剩余 SQL 代码时,我遇到了异常
System.NotSupportedException
,我该怎么做才能缓解这个问题?
SQL代码:
DECLARE @SomeNumbers varchar(max) = '665416:ABC,665416:XYZ';
DECLARE @Temp table (SomeNumber int, GridType varchar(20))
INSERT @Temp(SomeNumber, GridType)
SELECT CAST(Substring(Item, 1, Charindex(':', Item)-1) AS INTEGER), Substring(Item, Charindex(':', Item)+1, LEN(Item)) FROM dbo.[fnSplit](@SomeNumbers, ',')
SELECT * from @Temp
结果如下所示
我试图使用 Dapper 获得相同的结果,但是 这是我的代码 - 如果我尝试使用 kvp 列表填充临时表,我会得到
System.NotSupportedException
。
string SomeNumbers = "665416:ABC, 665416:XYZ";
List<string> result = FunctionExtension.fnSplit(SomeNumbers, ",");
List<KeyValuePair<int, string>> lstKvp = result.Select(s =>
{
string[] parts = s.Split(":");
return new KeyValuePair<int, string>(Convert.ToInt32(parts[0]), parts[1]);
}).ToList();
var parameters = new DynamicParameters();
parameters.Add("@lstKvp", lstKvp);
string sql = @"
DECLARE @Temp table (SomeNumber int, GridType varchar(20))
INSERT @Temp(SomeNumber, GridType)
SELECT @lstKvp
SELECT * from @Temp";
var res = await conn.QueryAsync(sql, parameters);
分割功能
public static List<string> fnSplit(string sInputList, string sDelimiter = ",")
{
// Create a list of strings to store the result
List<string> list = new List<string>();
// Split the input string by the delimiter and trim the whitespace
string[] items = sInputList.Split(sDelimiter, StringSplitOptions.TrimEntries);
// Loop through the items and add them to the list
foreach (string item in items)
{
// Check if the item is not empty
if (item.Length > 0)
{
// Add the item to the list
list.Add(item);
}
}
// Return the list
return list;
}
只是为了扩展我的评论。
如果您想在 SQL 中执行此操作,请考虑以下事项:
DECLARE @SomeNumbers varchar(max) = '665416:ABC,665416:XYZ';
DECLARE @Temp table (SomeNumber int, GridType varchar(20))
Insert Into @Temp
Select left(value,charindex(':',value)-1)
,substring(value,charindex(':',value)+1,50)
From string_split(@SomeNumbers,',')
Select * from @Temp