读书人

quot;Inquot;函数在存储过程中报错,该如何解决

发布时间: 2012-05-04 12:36:09 作者: rapoo

"In"函数在存储过程中报错
ALTER proc [dbo].[NSP_SelectResultListByTime]
@PIDList varchar(50),
@MyDateTime nvarchar(50)
as
if(LEN(@MyDateTime)=8)
begin
select PID,Sum(Value) as SumValue,RIGHT(MyDateTime,2) as DaTime from ResultList where PID in (@PIDList) and Left(MyDateTime,8)=@MyDateTime group by PID,RIGHT(MyDateTime,2),Left(MyDateTime,8)
end

问题:传入“String”参数("16,15,14"),执行存储过程时发生了错误,信息如下:
在将 varchar 值 '16,15,14' 转换成数据类型 int 时失败。

“@PIDList varchar(50)”变量声明的不对么???应该怎样修改呢???为什么呢???


[解决办法]
要么动态拼接 exec

要么用charindex
[解决办法]

SQL code
--exec示例if object_id('[tablename]') is not null drop table [tablename]create table [tablename] (id int,name varchar(1))insert into [tablename]select 1,'a' union allselect 2,'b' union allselect 3,'c' union allselect 4,'d' union allselect 5,'e' union allselect 6,'f'DECLARE @i VARCHAR(30) SET @i='1,4'EXEC('select * from [tablename] WHERE id IN ('+@i+')')/*id          name----------- ----1           a4           d*/--charindex示例if object_id('[tablename]') is not null drop table [tablename]create table [tablename] (id int,name varchar(1))insert into [tablename]select 1,'a' union allselect 2,'b' union allselect 3,'c' union allselect 4,'d' union allselect 5,'e' union allselect 6,'f'DECLARE @i VARCHAR(30) SET @i='1,4'SELECT * FROM [tablename] WHERE CHARINDEX(','+LTRIM(id)+',',','+@i+',')>0/*id          name----------- ----1           a4           d*/
[解决办法]
DECLARE @sql varchar(5000)
set @sql='select PID,Sum(Value) as SumValue,RIGHT(MyDateTime,2) as DaTime from ResultList where PID in (' + @PIDList +') and Left(MyDateTime,8)=@MyDateTime group by PID,RIGHT(MyDateTime,2),Left(MyDateTime,8)'
exec (@sql)

[解决办法]
问题:传入“String”参数("16,15,14"),执行存储过程时发生了错误,信息如下:
在将 varchar 值 '16,15,14' 转换成数据类型 int 时失败。

楼主试试传入参数“'16','15','14'”, 传入参数时把单引号也补上。
下面语句我测了可以工作。
SQL code
SELECT * FROM tablename WHERE 12 IN('12','13')
[解决办法]
LZ这样传参数相当于直接传了一个字符串到IN里面,也就是只是一个值,而不是你想象的是数字的序列所以才会报错。SQL是将整个@PIDList当成一个串整体处理的。

读书人网 >SQL Server

热点推荐