zoukankan      html  css  js  c++  java
  • SQL数据库问题 解释一下下面的代码 sql 存储过程学习

    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.

    请各位师兄指点!谢谢!



  • 相关阅读:
    防止死锁的加锁机制
    python线程threading.Timer源码解读
    python语言线程标准库threading.local源码解读
    栈和队列的总结
    如何根据入栈序列判断可能的出栈序列
    使用 Air 热编译 Gin 项目
    【Golang设计模式】7.外观模式
    Go中的数据类型、指针、new和make
    【Golang设计模式】6.模板方法模式
    【Golang设计模式】5.原型模式
  • 原文地址:https://www.cnblogs.com/meimao5211/p/3341048.html
Copyright © 2011-2022 走看看