唉!真是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(笔记)