您的位置:首页 > 数据库

SQL基本操作之存储过程(删除)的使用

2008-08-28 14:53 232 查看
唉!真是TM笨啊!

花了一上午的时间,就弄出来这么个东西,在此留下笔记,以备后用!

也请牛人们提供更好的方法!在此表示感谢!

问题!通过存储过程删除满足条件的记录(多个条件,多个表)

1、使用存储过程(不能实现的)

ALTER PROC [dbo].[PD_Del]

@WHEREA varchar(100),

@WHEREB sysname

as

DELETE FROM A WHERE A IN (WHEREA) AND B=@WHEREB

DELETE FROM B WHERE A IN (WHEREA) AND B=@WHEREB

执行(传入参数):EXEC PD_Del 'N','a,b,c' 需要实现:删除表中列A等于a,b,c并且B等于N等记录,同时删除关联表中与之相关的记录。

SQL输出:

(0 行受影响)

(0 行受影响)

原因:传入给存储过程的第二个参数是'a,b,c',SQL会将其识别为一个值,执行虽然通过了,但是违背了需要的实现,当然程序(C#)传值时也会引发异常。

2、使用存储过程(正确)

ALTER PROC [dbo].[PD_Del]

@WHEREA varchar(100),

@WHEREB sysname

as

DECLARE @sql varchar(1000)

SET @sql=''

SELECT @sql='DELETE A

WHERE A IN ('+@WHEREA+') AND B='''+@WHEREB+'''

DELETE B

WHERE A IN ('+@WHEREA+') AND B='''+@WHEREB+''''

EXEC (@sql)

参考:http://zhidao.baidu.com/question/47566448.html?fr=qrl

执行(传入参数):EXEC PD_Del 'N','a,b,c'

SQL 输出:

消息 207,级别 16,状态 1,第 2 行

列名 'c' 无效。

消息 207,级别 16,状态 1,第 2 行

列名 'b' 无效。

消息 207,级别 16,状态 1,第 2 行

列名 'a' 无效。

消息 207,级别 16,状态 1,第 4 行

列名 'c' 无效。

消息 207,级别 16,状态 1,第 4 行

列名 'b' 无效。

消息 207,级别 16,状态 1,第 4 行

列名 'a' 无效。

原因:使用过程中使用了字符串拼接,来动态构建输入条件,SQL将第二个传入的参数其作为表列名处理,最终导致报错。

执行(传入参数):EXEC PD_Del 'N','''a'',''b'',''c'''

执行成功。第二个参数传入了一个字符串,在删除条件中起到了作用,最终传入的值为:in('a','b','c')。则正确!。(注:sql中输出单引号使用:'' ,要想输出单个' 则需要:SELECT '''' ,要想输出'a',则需要:select '''a''',要想输出'a','b',则需要:select '''a'',''b''',可见,最外层一对单引号表示需要输出的是字符串)。 使用程序传入值时,需要拼接成跟第二个参数一样的字符串传入才会执行正确。

--2008-08-28(笔记)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐