none
有没有办法切换数据库 RRS feed

  • 问题



  • 使用游标遍历数据库,想在每一个数据库下面创建存储过程,存储过程里面是有动态sql的

    --批量创建sp_MoveClassifyResultData存储过程
    DECLARE @DBNAME NVARCHAR(100)
    DECLARE @SQL NVARCHAR(MAX)





    DECLARE CurDBName CURSOR
    FOR
        SELECT  name
        FROM    sys.[databases]
        WHERE   name LIKE '%Barefoot%'

    OPEN CurDBName
    FETCH NEXT FROM CurDBName INTO @DBNAME

    WHILE @@FETCH_STATUS = 0
        BEGIN  
            IF ( OBJECT_ID('[' + @DBNAME + '].[dbo].[sp_MoveClassifyResultData]') IS NOT NULL )
                BEGIN
                    SET @SQL = N'USE [' + @DBNAME
                        + '];
    DECLARE @SQL1 NVARCHAR(MAX) 
    SET @SQL1= ''DROP PROCEDURE [dbo].[sp_MoveClassifyResultData]''
    EXEC(@SQL1)'
                    EXEC(@SQL)
                END
           
               
            SET @SQL = N'USE [' + @DBNAME
                + '];
    DECLARE @SQL1 NVARCHAR(MAX) 
    SET @SQL1='+'''CREATE PROCEDURE [dbo].[sp_MoveClassifyResultData]
    AS
        BEGIN


    --回插数据
            BEGIN
                DECLARE @tsql VARCHAR(MAX)
                SET @tsql ='''+'''''
    SET IDENTITY_INSERT [ClassifyResult_T] ON 

         
    SET IDENTITY_INSERT [ClassifyResult_T] OFF 
                EXEC (@tsql)


                    EXEC(@SQL1)'

            EXEC (@SQL)
               

            FETCH NEXT FROM CurDBName INTO @DBNAME
        END
    CLOSE CurDBName
    DEALLOCATE CurDBName

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

    我现在使用的办法是,在里面再加一个exec(@sql1)切换到相应的数据库执行,但是太复杂,请问有没有别的方法

    在存储过程前加 数据库,或者加use 数据库这些不用想了,我都测试过

    2014年5月8日 0:18

答案

全部回复

  • --批量创建sp_MoveClassifyResultData存储过程
    DECLARE @DBNAME NVARCHAR(100)
     DECLARE @SQL NVARCHAR(MAX)
     DECLARE @sql_db nvarchar(1000)
    
     
    
     DECLARE CurDBName CURSOR
     FOR
         SELECT  name
         FROM    sys.[databases]
         WHERE   name LIKE '%Barefoot%'
    
     OPEN CurDBName
     FETCH NEXT FROM CurDBName INTO @DBNAME
    
     WHILE @@FETCH_STATUS = 0
         BEGIN  
    		SET @sql_db = QUOTENAME(@DBNAME) + '..sp_executesql';
    
             IF ( OBJECT_ID('[' + @DBNAME + '].[dbo].[sp_MoveClassifyResultData]') IS NOT NULL )
                 BEGIN
                     SET @SQL = N'
    DECLARE @SQL1 NVARCHAR(MAX) 
    SET @SQL1= ''DROP PROCEDURE [dbo].[sp_MoveClassifyResultData]''
    EXEC(@SQL1)'
                     EXEC @sql_db @SQL
                 END
            
                
             SET @SQL = N'
    DECLARE @SQL1 NVARCHAR(MAX) 
    SET @SQL1='+'''CREATE PROCEDURE [dbo].[sp_MoveClassifyResultData]
     AS
         BEGIN
    
    
    --回插数据
            BEGIN
                 DECLARE @tsql VARCHAR(MAX)
                 SET @tsql ='''+'''''
    SET IDENTITY_INSERT [ClassifyResult_T] ON 
    
          
    SET IDENTITY_INSERT [ClassifyResult_T] OFF 
                 EXEC (@tsql)
    
    
                     EXEC(@SQL1)'
    
             PRINT @SQL		-- @SQL 中的语句是不对的, 不知道你真正要做的是什么, 这个你自己改
    		 EXEC @sql_db @SQL
    		 
                
    
             FETCH NEXT FROM CurDBName INTO @DBNAME
         END
     CLOSE CurDBName
     DEALLOCATE CurDBName
    
     

    2014年5月8日 1:15
  • 你的 CREATE PROCEDURE [dbo].[sp_MoveClassifyResultData] 中的语句不对, 这个只能你自己改, 不知道你要在存储过程里面做什么处理
    2014年5月8日 1:17
  • 您好,

    另一个想法是,可以在一个数据库建立该 存储过程 给各数据库使用?

    或是使用 sp_MSForEachDB

    ref:Create Same Stored Procedure on All Databases using sp_MSForEachDB T-SQL Example


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已建议为答案 Wison-Ho 2014年5月8日 2:55
    • 已标记为答案 Steven.桦仔 2014年5月14日 13:47
    2014年5月8日 2:17
  • 你的 CREATE PROCEDURE [dbo].[sp_MoveClassifyResultData] 中的语句不对, 这个只能你自己改, 不知道你要在存储过程里面做什么处理
    那个存储过程我没有完整给出来,@tsql里面是一个动态sql,感觉太复杂了,因为本来存储过程里有动态sql,现在要切换数据库又要包装多一层,感觉太复杂
    2014年5月8日 5:45
  • sp_MSForEachDB不太好
    2014年5月8日 5:45
  • 借用前端工具,写个循环吧,更灵活

    Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com

    2014年5月10日 2:58
  • 没有VS开发工具,只能SQL
    2014年5月10日 7:33
  • 有两种方式可以实现:

    http://www.cnblogs.com/gaizai/p/3724965.html


    2014年5月21日 2:06