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