SQL数据库问题 解释一下下面的代码 sql 存储过程学习
SQL数据库问题 解释一下下面的代码
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
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.
请各位师兄指点!谢谢!
最新文章
- 简单的HttpClient使用
- IT小喇叭,关注于移动互联网创新、创业的科技媒体
- Pointers and Dynamic Allocation of Memory
- hibernate 实现分页查询语句、单条查询语句、多条查询语句、修改、删除语句
- Red5 第一个例子之HelloWorld
- Moses在Ubuntu14.04平台的安装过程
- asp 时间倒数后按钮可用
- c# webBrowser控件与js的交互
- Unity3D之Mecanim动画系统学习笔记(二):模型导入
- OC - 31.通过封装的自定义布局快速实现商品展示
- Spring4.0支持Groovy配置
- ssh-agent自启动加key脚本
- Unity 定时开启/关闭外部应用
- android webview处理下载内容
- C#数据结构之串
- asp.net C# 实现微信服务器配置
- 简单理解laravel框架中的服务容器,服务提供者以及怎样调用服务
- 【python游戏编程04--加载位图与常用的数学函数】
- Lua 与 C 交互之UserData(4)
- [转] Linux有问必答:如何修复“sshd error: could not load host key”
热门文章
- C# winform启动外部exe后,如何完全阻断父界面接收事件,扩展waitforexit
- 删除ListView item数据 页面不刷新
- 10、scala面向对象编程之Trait
- Oreacle 语句
- Java并发——阿里架构师是如何巧用线程池的!
- 【第四课】kaggle案例分析四
- c/c++排坑(4) -- c/c++中返回局部变量
- uva 133(The Dole Queue UVA - 133)
- Contest Round #451 (Div. 2)F/Problemset 898F Restoring the Expression
- ActiveMQ学习总结(10)——ActiveMQ采用Spring注解方式发送和监听