SQL数据库问题 解释一下下面的代码

2008-08-13 11:30wssqyl2000 | 分类:数据库DB | 浏览1154次
use master
go
create proc killspid
(
@dbname varchar(50)
)
as
begin
declare @sql nvarchar(500) declare @spid int
set @sql='declare getspid cursor for
select spid from sysprocesses where dbid=db_id('+@dbname+')'
print @sql
exec (@sql)
open getspid
fetch next from getspid into @spid
while @@FETCH_STATUS<>-1
begin
print @spid
exec ('kill '+@spid)
fetch next from getspid into @spid
end
close getspid
deallocate getspid
print 'OK'
end
分享到:

 
2008-08-13 17:07提问者采纳
 
use master --切换或者选中master数据库
go --上面的作为一次编译
create proc killspid--创建一个存储过程 killspid
(
@dbname varchar(50) --存储过程带有一个输入参数(参数的默认方式)
)
as --格式
begin --过程体开始
declare @sql nvarchar(500)--定义一个变量nvarchar类型@sql declare @spid int--定义一个int类型的变量@spid
set @sql='declare getspid cursor for
select spid from sysprocesses where dbid=db_id('+@dbname+')'--给变量@sql赋值 实际是一个存储过程
print @sql --输出变量@sql
exec (@sql) --执行上面的@sql语句里面的存储过程。
open getspid --
fetch next from getspid into @spid--获取存储过程查询到的值
while @@FETCH_STATUS<>-1 --如果获取到的数据集合大小!=-1
begin --循环开始
print @spid --输出@spid
exec ('kill '+@spid) --执行存储过程 (kill+@spid)整体作为一个存储过程的名称。
fetch next from getspid into @spid --回调
end --循环结束
close getspid --这2个不清楚
deallocate getspid
print 'OK'
end--存储过程体结束
这些语句一般用于数据库恢复的时候,其作用就是强制关闭已经连接到当前数据库的所有用户,以便于执行相关操作,比如数据恢复。从而妨止已经连接的用户读取到“脏”数据...

---------------------------------------------------------------------------

-- 第一部分T-SQL:
if exists (select * from sysobjects where name = 'killspbydbname')     drop procedure killspbydbname

-- 第一部分T-SQL:
create procedure killSpByDbName
@dbname varchar ( 20)
as
declare @sql nvarchar ( 500) 
declare @spid int                  
set @sql = 'declare getspid cursor for select spid from sysprocesses where dbid=db_id(''' + @dbname + ''')'                           
exec ( @sql )                   
open getspid                       
fetch next from getspid into @spid
while @@fetch_status <> -1      
begin 
exec ( 'kill ' + @spid )       
fetch next from getspid into @spid 
end 
close getspid  
deallocate getspid

-- 第三部分T-SQL:
exec killSpByDbName 'tempDataBase '    -- tempDataBase是待还原的数据

当在SQL Sever Query Analyser执行上述T-SQL时,会出现这样的错误:'CREATE PROCEDURE' must be the first statement in a query batch.  而当在第一部分T-SQL和第二部分T-SQL之间使用GO的话,就可以正确执行。请问这是为什么。还有如果在C#程序中执行上述T-SQL的话,是不能使用GO的。当然,可以使用ExecuteNonQuery分别执行第一部分T-SQL和第二部分T-SQL,但是我希望能有另一种更好的方法,可以在应用程序中一次性执行上述第一部分T-SQL和第二部分T-SQL。同样的情况也发生在第二部分T-SQL和第三部分T-SQL,当这两部T-SQL之间有GO时,不会出现问题,但当这两部分之间没有GO,且一次性执行这两部分T-SQL时,就会有这样的错误:Cannot add rows to sysdepends for the current stored procedure because it depends on the missing object 'killSpByDbName'. The stored procedure will still be created.

请各位师兄指点!谢谢!


最新文章

  1. 简单的HttpClient使用
  2. IT小喇叭,关注于移动互联网创新、创业的科技媒体
  3. Pointers and Dynamic Allocation of Memory
  4. hibernate 实现分页查询语句、单条查询语句、多条查询语句、修改、删除语句
  5. Red5 第一个例子之HelloWorld
  6. Moses在Ubuntu14.04平台的安装过程
  7. asp 时间倒数后按钮可用
  8. c# webBrowser控件与js的交互
  9. Unity3D之Mecanim动画系统学习笔记(二):模型导入
  10. OC - 31.通过封装的自定义布局快速实现商品展示
  11. Spring4.0支持Groovy配置
  12. ssh-agent自启动加key脚本
  13. Unity 定时开启/关闭外部应用
  14. android webview处理下载内容
  15. C#数据结构之串
  16. asp.net C# 实现微信服务器配置
  17. 简单理解laravel框架中的服务容器,服务提供者以及怎样调用服务
  18. 【python游戏编程04--加载位图与常用的数学函数】
  19. Lua 与 C 交互之UserData(4)
  20. [转] Linux有问必答:如何修复“sshd error: could not load host key”

热门文章

  1. C# winform启动外部exe后,如何完全阻断父界面接收事件,扩展waitforexit
  2. 删除ListView item数据 页面不刷新
  3. 10、scala面向对象编程之Trait
  4. Oreacle 语句
  5. Java并发——阿里架构师是如何巧用线程池的!
  6. 【第四课】kaggle案例分析四
  7. c/c++排坑(4) -- c/c++中返回局部变量
  8. uva 133(The Dole Queue UVA - 133)
  9. Contest Round #451 (Div. 2)F/Problemset 898F Restoring the Expression
  10. ActiveMQ学习总结(10)——ActiveMQ采用Spring注解方式发送和监听