SQL数据库问题 解释一下下面的代码 sql 存储过程学习
2013-09-26 16:27
921 查看
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.请各位师兄指点!谢谢!
相关文章推荐
- 我也谈谈 代码调用存储过程超时,SQL Server Management Studio里运行很快的问题
- 验证选择每日学习总结:DropDownList是否已选择验证、存储过程参数为sql字符串问题、将截断字符串或二进制数据。\r\n语句已终止
- 每日学习总结:DropDownList是否已选择验证、存储过程参数为sql字符串问题、将截断字符串或二进制数据。\r\n语句已终止
- 每日学习总结:DropDownList是否已选择验证、存储过程参数为sql字符串问题、将截断字符串或二进制数据。\r\n语句已终止
- 三种SQL分页查询的存储过程代码
- 【原】SQL存储过程调用慢,但是重新编译一下存储过程就很快
- 实现SQL分页的存储过程代码
- sql 存储过程中top 后面跟参数的问题
- sql分页存储过程代码(转)
- TinyHttp学习(二): 代码分块解释以及相关问题
- 简单搞一下 Oracle 存储过程动态SQL之获取查询总数!
- 存储过程中用exec执行sql语句问题
- sql 判断函数、存储过程是否存在的代码整理
- [PL/SQL] 请教大家一个问题,存储过程中需要几个commit?
- SQL 学习笔记<六> MySQL存储过程基础
- 存储过程 VS 嵌入代码的sql语句
- ASP.NET代码调用SQL Server带DateTime类型参数的存储过程抛出异常问题
- [学习]自动产生SQL SERVER存储过程和T-sql
- sql存储过程学习实例