过长字符串参数的处理 根据某个字符串分割
此处只针对 像一般拼接id字符串这样的参数,例: 1,2,3,4
主要处理这样的业务逻辑缩写的方法,可以解决这样的字符串长度过长,导致存储过程参数超过长度。
如果是其他的需求,也可以按照这个思路,先把字符串存储在一张表中,用的时候把查询语句当参数传入存储过程,这样就不会很长了
首先创建一张 需要存放过长字符串的表TempMaxString
字段: TableId InsertTime MaxString
//底层方法 (静态直接引用)
public static string SqlToTempMaxString(this string tb, string splitString)
{
if (tb.Length <= 600) //如果字符串超过一定长度
return tb;
else //长度超过600 则使用函数
{
//此处插入数据库 获取表id
int TempMaxStringTableId = BLLLogicLinkLearnHelper.TempMaxStringLogic.Insert(new TempMaxStringInfo()
{
InsertTime = DateTime.Now,
MaxString = tb
});
//此处用了一个函数处理字符串(最终存储过程传入的参数是下面这句sql)
return string.Format("select c1 from dbo.func_splitstring((select MaxString from TempMaxString where TableId = {0}),'{1}')", TempMaxStringTableId, splitString);
}
}
函数脚本: (执行就创建)
/****** Object: UserDefinedFunction [dbo].[func_splitstring] Script Date: 2019/8/28 10:52:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE function [dbo].[func_splitstring]
(@str nvarchar(max),@split varchar(10))
returns @t Table (c1 varchar(100),OrderId int)
as
begin
declare @i int,@index int,@s int
set @index = 1
set @i=1
set @s=1
while(@i>0)
begin
set @i=charindex(@split,@str,@s)
if(@i>0)
begin
insert @t(c1,OrderId) values(substring(@str,@s,@i-@s),@index)
set @index = @index + 1
end
else begin
insert @t(c1,OrderId) values(substring(@str,@s,len(@str)-@s+1),@index)
set @index = @index + 1
end
set @s = @i + LEN(@split)
end
return
end
GO