关于sqlserver中存储过程里面in关键字的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于sqlserver中存储过程里面in关键字的使用相关的知识,希望对你有一定的参考价值。

这是我一个程序里要用到的,用户批量删除自己的简历,因为防止他删除其他人的信息,所以加了uid=@uid这个条件。

存储过程:delete from table1 where id in ('+@chooseid+') and uid=@uid

执行的时候,如果选择了一条信息,执行能成功,但是如果是两条以上,就会出现“无法转换为int”的错误。

我知道有另外一个方法是用:exec 来执行动态构建的操作命令。但是那样的话@uid这个变量就不能防止注入攻击了。
@chooseid这个变量我在程序里已经判断了只允许使用数字和逗号。

请问有什么好的办法吗?
@uid是字符型的。是用户的用户名

有一个用户表,和一个简历表,用户表里保存了多个登录用户的信息;简历表里有每个用户的简历,是一对多的关系,两个表是通过用户名关联的,用户登录以后可以管理 自己的简历,批量删除的时候我想用存储过程来做,所以就写了这个存储过程。

create.... deleteUserJianli
@chooseid varchar(50),--这是用户选择的要被删除的简历id
@uid varchar(50)--这是用户的用户名
as
delete from jianli where id in ('+@chooseid+') and uid=@uid
go

首先就是@chooseid的问题
如果你这样in的话
即使你的 @chooseid=1,2,3
他也会把这几个看做一个整体
也就是把 id 同 '1,2,3'这个整体去比对
而不是拆开

这样的话只能用动态去构建

declare @sql varchar(1000)
set @sql=''
select @sql='delete from table1 where id in ('+ @chooseid+') and uid='+@uid
exec(@sql)

动态构建 也是可以增加@uid的条件的啊...
不太明白你的意思
你可以把代码写全
肯定是可以动态的
写全了 我给你写
参考技术A 无法转换为int
是不是传递参数时多加了单引号。
或是少加拉,好好检查检查,是不是类型不匹配
参考技术B 存储过程里用exec 来执行动态构建的操作命令,@uid参数在存储过程定义为int,已经可以防止注入攻击了吧,

sql server 2008,如何查看存储过程里面的内容?

参考技术A

    1 打开Microsoft  SQL Server数据库管理工具,选择SQL Server身份验证,输入登录名和用户密码,点击连接按钮。

    2 选择要查看的数据库,展开所有选项。

    3 在展开的所有列表中,选择‘可编程性’文件夹,并将其展开。

    4 在‘可编程性’文件夹里,选择‘存储过程’并单击其前面的‘+’号,让其展开。下拉列表里会显示系统和用户的所有存储过程。

    5 选择要查看的存储过程,依次选择:‘编写存储过程脚本为’--->‘Alter到’--->‘新的查询编辑器窗口’。可以修改存储过程。

    6 存储过程的代码会显示在右边,可以对代码进行修改,保存后执行成功。

以上是关于关于sqlserver中存储过程里面in关键字的使用的主要内容,如果未能解决你的问题,请参考以下文章

关于oracle存储过程中的sql拼接,大神进!!!

sqlserver 存储过程 保存在哪张表里如何通过select语句查询哪些存储过程是包含某个关键词

sqlserver 2008 关于存储过程中的临时表。

查询存储过程里面的含有的关键字

sqlserver里面怎么执行mysql的存储过程

关于sqlserver存储过程事务锁的问题