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(笔记)
花了一上午的时间,就弄出来这么个东西,在此留下笔记,以备后用!
也请牛人们提供更好的方法!在此表示感谢!
问题!通过存储过程删除满足条件的记录(多个条件,多个表)
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(笔记)
相关文章推荐
- DataGrid的使用:(一)、在DataGrid控件中实现基本的操作(编辑、删除、分页)
- Linq to sql:使用存储过程删除数据
- 对重复的记录使用SQL进行查询和删除等操作
- 用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等
- 用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等
- 用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等
- shell脚本操作mysql数据库,使用mysql的-e参数可以执行各种sql的(创建,删除,增,删,改、查)等各种操作
- iOS开发中使用SQL语句操作数据库的基本用法指南
- mysql 使用游标进行删除操作的存储过程
- Sql中存储过程的定义、修改和删除操作
- SQL语句添加删除修改字段及其他基本操作(33条)转
- 用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等,需要的朋友可以参考下。
- 使用SQL语句对表进行插入、修改和删除数据操作
- 使用Pandas实现SQL基本操作
- Sql中存储过程的定义、修改和删除操作
- DataGrid的使用:(一)在DataGrid控件中实现基本的操作(编辑、删除、分页)
- csdn 在c++ builder中,使用treeview实现对xml文档增加删除修改和查询等基本操作
- MSSQL-用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等
- 用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等
- 使用“一条”SQL语句完成批量插入和批量删除操作