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

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

 

 

 

 

转载于:https://www.cnblogs.com/ject/archive/2008/08/28/sql_proc.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值