求一条SQL存储过程和事务处理语句

風箏線已斷 2013-08-17 01:32:49
我从变量中取得数据(ID) 类似(1,2,3,4,5,6,7,8)
下面是我写的存储过程,不知道怎么写才是正确的,求正确答案

create procedure pro_DelModelList_sysrole
(
@ListId nvarchar(max) --即上面的id
)
as
begin transaction
declare @error int
declare @sql nvarchar(1000)
set @error = 0
set @sql = 'delete from tb_sys_role where id in ('+@ListId+')' --我想把这条语句中删除要么全部成功要么有一条没删除就全不删除
exec sp_ExecuteSql @sql
set @error = @error+ @@error
if @error <>0
begin
print '有错误,回滚'
rollback transaction
end
else
begin
PRINT '成功'
commit transaction
end
...全文
153 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
風箏線已斷 2013-08-17
  • 打赏
  • 举报
回复
引用 10 楼 hdhai9451 的回复:
[quote=引用 9 楼 Jim_qiang 的回复:] [quote=引用 8 楼 ap0405140 的回复:] 须先判断要删除的ID都是否存在,如有不存在的则别删除直接返回..
嗯,这个想到了,我现在就是不知道楼上他们写的这些方法能不能实现当一条删除失败则全部失败,比如说删除的时候删除到某条时时间超载,然后奔溃了的网页,他是不是把可以删除的删掉了?不知道怎么致使这种错误,不然想试下![/quote] 你已经使用事务,不用担心这个问题,要么全部删除成功,要么全部删除失败。 不会存在一部分删除成功,一部分删除失败。 [/quote] 哦哦,那就行,最后一个问题,既然这样,我开始用in那样写的,他可以删除,也利用了事务,应该也可以达到我需要的效果吧?你写的那条语句是对的,但不是很理解!所以...
Andy__Huang 2013-08-17
  • 打赏
  • 举报
回复
引用 9 楼 Jim_qiang 的回复:
[quote=引用 8 楼 ap0405140 的回复:] 须先判断要删除的ID都是否存在,如有不存在的则别删除直接返回..
嗯,这个想到了,我现在就是不知道楼上他们写的这些方法能不能实现当一条删除失败则全部失败,比如说删除的时候删除到某条时时间超载,然后奔溃了的网页,他是不是把可以删除的删掉了?不知道怎么致使这种错误,不然想试下![/quote] 你已经使用事务,不用担心这个问题,要么全部删除成功,要么全部删除失败。 不会存在一部分删除成功,一部分删除失败。
風箏線已斷 2013-08-17
  • 打赏
  • 举报
回复
引用 8 楼 ap0405140 的回复:
须先判断要删除的ID都是否存在,如有不存在的则别删除直接返回..
嗯,这个想到了,我现在就是不知道楼上他们写的这些方法能不能实现当一条删除失败则全部失败,比如说删除的时候删除到某条时时间超载,然后奔溃了的网页,他是不是把可以删除的删掉了?不知道怎么致使这种错误,不然想试下!
唐诗三百首 2013-08-17
  • 打赏
  • 举报
回复
须先判断要删除的ID都是否存在,如有不存在的则别删除直接返回..
風箏線已斷 2013-08-17
  • 打赏
  • 举报
回复
引用 6 楼 hdhai9451 的回复:
[quote=引用 3 楼 Jim_qiang 的回复:] [quote=引用 1 楼 hdhai9451 的回复:]

create procedure pro_DelModelList_sysrole
(
	@ListId nvarchar(max) --即上面的id
)
as
begin transaction 
	declare  @error int

	set @error = 0
	delete from tb_sys_role where CHARINDEX(','+cast(id as varchar)+',',','+@ListId+',')>0 --我想把这条语句中删除要么全部成功要么有一条没删除就全不删除
	set @error = @error+ @@error
if @error <>0
	begin
		print  '有错误,回滚'
		rollback transaction
	end
else
begin
	PRINT '成功'
	commit transaction
end

go
你好,谢谢你的解答,按你这种方法试了下还是一样有点问题: exec pro_DelModelList_sysrole '16,17,18,19' 数据库只存在16,17 他就成功删除2条,并不会失败.可以再看下吗?[/quote] 你看对照有多少个ID删除,分析一下数据[/quote] 得到的ID 为(16,17,18,19) 我数据库中其实只存在ID为16,17的并不存在id为18,19的。 然后他就成功删除了ID为16,17的,我不知道我列的这个反例是不是搞错了,我现在就是想试下假如获得的ID里有 没成功删除的,就别能删多少个数据就删多少这样!
Andy__Huang 2013-08-17
  • 打赏
  • 举报
回复
引用 3 楼 Jim_qiang 的回复:
[quote=引用 1 楼 hdhai9451 的回复:]

create procedure pro_DelModelList_sysrole
(
	@ListId nvarchar(max) --即上面的id
)
as
begin transaction 
	declare  @error int

	set @error = 0
	delete from tb_sys_role where CHARINDEX(','+cast(id as varchar)+',',','+@ListId+',')>0 --我想把这条语句中删除要么全部成功要么有一条没删除就全不删除
	set @error = @error+ @@error
if @error <>0
	begin
		print  '有错误,回滚'
		rollback transaction
	end
else
begin
	PRINT '成功'
	commit transaction
end

go
你好,谢谢你的解答,按你这种方法试了下还是一样有点问题: exec pro_DelModelList_sysrole '16,17,18,19' 数据库只存在16,17 他就成功删除2条,并不会失败.可以再看下吗?[/quote] 你看对照有多少个ID删除,分析一下数据
風箏線已斷 2013-08-17
  • 打赏
  • 举报
回复
引用 4 楼 gogodiy 的回复:

create procedure pro_DelModelList_sysrole
(
    @ListId nvarchar(max) --即上面的id
)
as
begin
	set nocount on;
	
	declare @sql nvarchar(1000)
	
	set @sql = 'delete from  tb_sys_role where id in ('+@ListId+')' --我想把这条语句中删除要么全部成功要么有一条没删除就全不删除
	
    exec sp_ExecuteSql @sql
end
直接这样就可以了。
好像我表达出错了,感觉有点晕,能不能举个一条错误全部删除失败的例子出来试下啊?我现在试的都是in里面有多少他就删多少.
gogodiy 2013-08-17
  • 打赏
  • 举报
回复

create procedure pro_DelModelList_sysrole
(
    @ListId nvarchar(max) --即上面的id
)
as
begin
	set nocount on;
	
	declare @sql nvarchar(1000)
	
	set @sql = 'delete from  tb_sys_role where id in ('+@ListId+')' --我想把这条语句中删除要么全部成功要么有一条没删除就全不删除
	
    exec sp_ExecuteSql @sql
end
直接这样就可以了。
風箏線已斷 2013-08-17
  • 打赏
  • 举报
回复
引用 1 楼 hdhai9451 的回复:

create procedure pro_DelModelList_sysrole
(
	@ListId nvarchar(max) --即上面的id
)
as
begin transaction 
	declare  @error int

	set @error = 0
	delete from tb_sys_role where CHARINDEX(','+cast(id as varchar)+',',','+@ListId+',')>0 --我想把这条语句中删除要么全部成功要么有一条没删除就全不删除
	set @error = @error+ @@error
if @error <>0
	begin
		print  '有错误,回滚'
		rollback transaction
	end
else
begin
	PRINT '成功'
	commit transaction
end

go
你好,谢谢你的解答,按你这种方法试了下还是一样有点问题: exec pro_DelModelList_sysrole '16,17,18,19' 数据库只存在16,17 他就成功删除2条,并不会失败.可以再看下吗?
lzw_0736 2013-08-17
  • 打赏
  • 举报
回复

create procedure pro_DelModelList_sysrole
(
    @ListId nvarchar(max) --即上面的id
)
as
begin
    begin transaction 
        declare  @error int
        declare @sql nvarchar(1000)
        set @error = 0
        set @sql = 'delete from  tb_sys_role where id in ('+@ListId+')' --我想把这条语句中删除要么全部成功要么有一条没删除就全不删除
        exec sp_ExecuteSql @sql
      set @error = @error+ @@error
    if @error <>0
        begin
    print  '有错误,回滚'
    rollback transaction
        end
    else
    begin
        PRINT '成功'
        commit transaction
    end
end
Andy__Huang 2013-08-17
  • 打赏
  • 举报
回复

create procedure pro_DelModelList_sysrole
(
	@ListId nvarchar(max) --即上面的id
)
as
begin transaction 
	declare  @error int

	set @error = 0
	delete from tb_sys_role where CHARINDEX(','+cast(id as varchar)+',',','+@ListId+',')>0 --我想把这条语句中删除要么全部成功要么有一条没删除就全不删除
	set @error = @error+ @@error
if @error <>0
	begin
		print  '有错误,回滚'
		rollback transaction
	end
else
begin
	PRINT '成功'
	commit transaction
end

go

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧