exec sp_prepexec 问题

guo83551218 2013-09-02 05:51:41
declare @p1 int
exec sp_prepexec @p1 output,N'@P0 nvarchar(4000)',N'delete from [login] where [empid] in (@P0)',
N'20102820'
成功

declare @p1 int
exec sp_prepexec @p1 output,N'@P0 nvarchar(4000)',N'delete from [login] where [empid] in (@P0)',
N'20102832,20102820,20102821'
失败

为什么@P0 参数变成'20102832,20102820,20102821' 就执行不成功啊??
...全文
578 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Andy__Huang 2013-09-02
  • 打赏
  • 举报
回复
多个id组合,应该这样写:
declare @p1 int
exec sp_prepexec @p1 output,N'@P0 nvarchar(4000)',N'delete from [login] where charindex('',''+cast(empid as varchar)+'','','',''+@P0+'','')>0',
N'20102832,20102820,20102821'
Shawn 2013-09-02
  • 打赏
  • 举报
回复
CREATE TABLE [login](empid INT)

--成功
declare @p1 int
exec sp_prepexec @p1 output,N'@P0 nvarchar(4000)',N'delete from [login] where [empid] in (@P0)',
N'20102820'

--报错
declare @p1 int
exec sp_prepexec @p1 output,N'@P0 nvarchar(4000)',N'delete from [login] where [empid] in (@P0)',
N'20102832,20102820,20102821'

--sp_prepexec 是参数化查询,它会把 "20102832,20102820,20102821" 整个字符串当成一个值,而不会像我们平时写SQL IN语法那样,把它当成3个值.
--字符串与整数型对比时,默认把字符串转换成整型再作比较,所以报错了
/*
消息 245,级别 16,状态 1,第 1 行
在将 nvarchar 值 '20102832,20102820,20102821' 转换成数据类型 int 时失败。
*/

34,575

社区成员

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

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