首先我在.net类库里调用SQL里的存储过程,该存储过程有两个UniqueIdentifier类型的参数,如shiftID, classID。在存储过程中是用在where条件后的in 条件中的,也就是说是多个shiftid或classid通过逗号隔开使用,现在我在存储过程中定义shiftID与classID分别为nvarchar(max)。
那么在.net库中调用的时候首先获取该参数:
string shiftid = Tools.ToString(HttpContext.Request.Params["shiftid"]);
string classid = Tools.ToString(HttpContext.Request.Params["ClassId"]);
然后加入到SQL参数集合中:
paraList.Add(DBHelper.GetParameter("@ShiftID", SqlDbType.NVarChar, 4000, (shiftid != string.Empty ?(object)Tools.QuoteSplitString(shiftid):DBNull.Value)));
paraList.Add(DBHelper.GetParameter("@ClassID", SqlDbType.NVarChar, 4000, (classid != string.Empty ? (Object)Tools.QuoteSplitString(classid) : DBNull.Value)));
这里的Tools.QuoteSplitString方法是一个公共方法,它主要把如2d01aaab-4c66-475f-b8c3-8f9da4d648cf,b0a067e3-dc45-442a-8e96-dc9d135f970f 转换成“‘2d01aaab-4c66-475f-b8c3-8f9da4d648cf’,‘b0a067e3-dc45-442a-8e96-dc9d135f970f’”这种字符串类型,那么现在cmd执行SQL的时候报将字符串转换UniqueIdentifier类型失败,这是SQL中报的错。
总体来说就是:使用,NET库,调用SQl存储过程中如何把用逗号隔开的字符串参数传到是nvarchar类型的SQL语句中
存储过程定义的参数是什么,外面的AddParameter对面的SQLDbType就要和它一样。
恩,我明白你的意思, 但是还是没有得到解决, 可能是我描述问题不够清楚,
@奇妙能力: 如果还没解决,就换cyq.data orm处理吧
可以使用数据库函数处理分割参数,比如:
create FUNCTION [dbo].[func_split](@str nvarchar(4000),@separtor varchar(10))
returns @temp table([row] [int] IDENTITY(1,1) NOT NULL,valuess nvarchar(4000))
as
begin
declare @i int
set @str=rtrim(ltrim(@str))
set @i=charindex(@separtor,@str)
while @i>=1
begin
insert @temp values(left(@str,@i-1))
set @str=substring(@str,@i+1,len(@str)-@i)
set @i=charindex(@separtor,@str)
end
if @str<>''
insert @temp values(@str)
--测试
select * from dbo.func_split('1,2,3,4,5,7', ',')
return
end