"In"函数在存储过程中报错

starrycheng 2012-05-01 10:02:14
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)”变量声明的不对么???应该怎样修改呢???为什么呢???

...全文
94 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤独加百列 2012-05-03
  • 打赏
  • 举报
回复
LZ这样传参数相当于直接传了一个字符串到IN里面,也就是只是一个值,而不是你想象的是数字的序列所以才会报错。SQL是将整个@PIDList当成一个串整体处理的。
十林 2012-05-03
  • 打赏
  • 举报
回复
问题:传入“String”参数("16,15,14"),执行存储过程时发生了错误,信息如下:
在将 varchar 值 '16,15,14' 转换成数据类型 int 时失败。


楼主试试传入参数“'16','15','14'”, 传入参数时把单引号也补上。
下面语句我测了可以工作。
SELECT * FROM tablename WHERE 12 IN('12','13')
唐诗三百首 2012-05-02
  • 打赏
  • 举报
回复
因为PID是int型, @PIDList是varchar型. 不匹配.
starrycheng 2012-05-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

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 all
select 2,'b' union a……
[/Quote]

谢谢,但为什么采用拼接字符串的方式就可以屏蔽这个问题呢???
liyangfd 2012-05-01
  • 打赏
  • 举报
回复
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)
叶子 2012-05-01
  • 打赏
  • 举报
回复
--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 all
select 2,'b' union all
select 3,'c' union all
select 4,'d' union all
select 5,'e' union all
select 6,'f'

DECLARE @i VARCHAR(30) SET @i='1,4'
EXEC('select * from [tablename] WHERE id IN ('+@i+')')
/*
id name
----------- ----
1 a
4 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 all
select 2,'b' union all
select 3,'c' union all
select 4,'d' union all
select 5,'e' union all
select 6,'f'

DECLARE @i VARCHAR(30) SET @i='1,4'

SELECT * FROM [tablename]
WHERE CHARINDEX(','+LTRIM(id)+',',','+@i+',')>0

/*
id name
----------- ----
1 a
4 d
*/
叶子 2012-05-01
  • 打赏
  • 举报
回复
要么动态拼接 exec

要么用charindex

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧