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数据库问题 解释一下下面的代码 sql 存储过程学习的更多相关文章

  1. SQL数据库开发中的一些经典代码

    1.按姓氏笔画排序: Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as  2.数据库加密: ...

  2. 将*.sql数据库脚本导入到sqlserver中(sql文件导入sqlserver)

    在SqlServer中这个是用生成sql脚本生成的 要是在导入数据库用数据导入/导出向导导不进去 其实要用查询分析器来打开sql文件 然后执行就可以了

  3. SQL数据库,增加查询修改以及防sql写入攻击

    SQL添加信息 SQL查询信息 SQL修改信息 SQL语句写入攻击: 普通语句添加信息 sql写入语句攻击: 解决方法:分开传送语句与参数关键:@

  4. ASP.NET动态网站制作(15)-- SQL数据库(1)

    前言:数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,用户可以对文件中的数据进行增.删.改.查.数据库有很多种类型,从简单的存储有各种数据的表格到能都进行海量数据存储的大型数据库 ...

  5. SQL数据库的备份和恢复

    SQL数据库的备份和恢复 一.SQL数据库的备份: 1.依次打开 开始菜单 → 程序 → Microsoft SQL Server 2008 → SQL Server Management Studi ...

  6. (译)Windows Azure的7月更新:SQL数据库,流量管理,自动缩放,虚拟机

    Windows Azure的7月更新:SQL数据库,流量管理,自动缩放,虚拟机 今早我们释出一些很棒的Windows Azure更新.这些新的提升包括:SQL数据库:支持SQL自动导出和一个新的高级层 ...

  7. 用SQL数据库做多表关联应怎样设计库结构20170527

    http://77857.blog.51cto.com/67857/143872/ 多表关联的话表之间必须得存在关系才行呢,这样建立外键约束就行了, 关系表中插入主表的主键做外键. 假设表1学生表st ...

  8. 如何将Azure SQL 数据库还原到本地数据库实例中

    原文:https://www.jerriepelser.com/blog/restore-sql-database-localdb/ 原文作者: Jerrie Pelser 译文:如何将Azure S ...

  9. 聚焦 SQL 数据库活动异地复制

    Tobias Ternstrom  US-DS-PM 首席部门项目经理 本文作为一系列业务连续性和灾难恢复文章的开篇,概述了业务连续性的各种场景,然后重点介绍 SQL 数据库高级服务级别提供的活动异地 ...

随机推荐

  1. EF code first Acceleration - CodeFirst 加速

    EntityFramework Code First 用起来很方便,可是有时感觉卡,就是有点慢.可以采用以下措施来加速一下,原来取出1万条记录并显示在Winform窗体上第一次需要1.9秒的时间,加速 ...

  2. JS——for

    打印两行星星: <script> for (var i = 0; i < 2; i++) { for (var j = 0; j < 10; j++) { document.w ...

  3. 在把table表格中的数据导出到Excel的时候,以科学计数法显示位数多的数字时怎么解决?

    sbHtml.AppendFormat("<td> {0}</td>", data[i].IDcard.ToString()); sbHtml.Append ...

  4. C# 打开模态对话框 和打开文件夹

    C# 打开另一个窗体,(模态对话框) Form1 frm= new Form1(); //创建对象 DialogResult retServer = frm.ShowDialog(); //模式对话框 ...

  5. querySelector

     this.el.nativeElement.querySelector import {Component, ElementRef, OnInit} from '@angular/core'; 

  6. Git学习总结(标签管理)

    在Git中打标签非常简单,首先,切换到需要打标签的分支上: 然后,敲命令git tag <name>就可以打一个新标签: $ git tag v1. 可以用命令git tag查看所有标签: ...

  7. cshtml中字符串中表示特殊字符@

    用“@@”表示字符串中的特殊字符@

  8. swift 再识枚举变量

    // Use enum to create an enumeration. Like classes and all other named types, enumerations can have ...

  9. 输出n*n矩阵

    int matrix[MAX][MAX]; void PrintMatrix(int x,int y,int start,int n) { ) return ; ) { matrix[x][y] = ...

  10. Vi/Vim基本用法

    Vi/Vim是Linux中一款功能强大的编辑器,vi是Visual Interface的缩写,即可视化接口,vim是vi iMprove的缩写,即 vi的增强版(具有语法着色功能).它在Linux上的 ...