DECLARE @dbname VARCHAR(50)
DECLARE @t table(id INT IDENTITY(1,1),dbname VARCHAR(50))
DECLARE @i int,@count INT
DECLARE @sql nVARCHAR(MAX)  
select @i = 1,@count = 0
INSERT INTO @t(dbname) SELECT NAME FROM MASTER.DBO.SYSDATABASES where name not in (‘master’,’model’,’msdb’,’tempdb’,’ReportServer’,’ReportServerTempDB’) ORDER BY NAME
SELECT @count = COUNT(1) FROM @t
WHILE @i <= @count
BEGIN
    SELECT @dbname = dbname FROM @t WHERE id = @i
    PRINT @dbname
    SET @sql = ‘use [‘+@dbname +’]’+ char(13)+char(10)+
      ‘
         update maintainitem set 维修项目代码= isnull(维修项目代码,’’’’)  where 1=0            
      ‘
    begin try  
      print @sql
   EXEC (@sql)
   select  @dbname as db,’成功’ AS ErrMsg    
    end try
    begin catch
  —SELECT ERROR_NUMBER() AS ErrNum,ERROR_SEVERITY()AS ErrSev,ERROR_STATE() AS ErrState,ERROR_PROCEDURE() AS ErrProc,ERROR_LINE()AS ErrLine,ERROR_MESSAGE()AS ErrMsg    
  select  @dbname as db, ERROR_MESSAGE()AS ErrMsg    
    end catch
    SET @i = @i+1
END
—@sqlOperateText,
—输入纯sql语句,把单引号替换为2个单引号,替换1次即可,但CATCH不能截获【表名不存在等错误】,
—如果要截获就需要在catch里用exec执行,即就需要用@sqlProcText,把语句中的单引号替换为2个单引号,替换2次,即1个单号变成4个
—例如:
—   使用@sqlOperateText 语句为:set @sqlOperateText = ‘update users set username=’’xxx’’ where 1=0 ‘
—   使用@sqlProcText 语句为:set @sqlProcText = ‘update users set username=’’’’xxx’’’’ where 1=0 ‘
DECLARE @sqlOperateText VARCHAR(MAX)  
—@sqlProcText主要更新存储过程/函数内容,需要把单引号替换为2个单引号,替换2次,即1个单号变成4个
—例如:
—   set @sqlProcText =  
/   ‘  
   alter proc pp_test as  
    BEGIN
      select ‘’’’xxx’’’’ as xxx  
    END  
     ‘
/
DECLARE @sqlProcText VARCHAR(MAX)  
SET @sqlOperateText =
‘
    —update users set username=’’xxx’’ where 1=0  
‘
—即1个单号变成4个
—即1个单号变成4个
—即1个单号变成4个
—即1个单号变成4个
—即1个单号变成4个
—即1个单号变成4个
—不要带go
—仅一个存储过程
SET @sqlProcText =  
‘  
    create proc pp_test
    as
    BEGIN
  select ‘’’’bbb’’’’ as xxx  
    END  
‘
DECLARE @dbname VARCHAR(50)
DECLARE @t table(id INT IDENTITY(1,1),dbname VARCHAR(50))
DECLARE @i int,@count INT
DECLARE @sql VARCHAR(MAX)  
select @i = 1,@count = 0
INSERT INTO @t(dbname) SELECT NAME FROM MASTER.DBO.SYSDATABASES where NAME NOT IN (‘master’,’model’,’msdb’,’tempdb’) ORDER BY NAME
SELECT @count = COUNT(1) FROM @t
WHILE @i <= @count
BEGIN
    SELECT @dbname = dbname FROM @t WHERE id = @i
    PRINT ‘开始执行:’+@dbname
    —执行单独语句
    IF(isnull(ltrim(rtrim(@sqlOperateText)),’’)!=’’)
    begin
     SET @sql =
      ‘ BEGIN TRY  use ‘+@dbname +CHAR(13)+
    @sqlOperateText +
      ‘ END TRY
     BEGIN CATCH
     SELECT   db_name() as dbname,ERROR_MESSAGE() AS ErrorMessage ,
          ERROR_SEVERITY() AS ErrorSeverity ,
          ERROR_STATE() AS ErrorState    
     END CATCH      ‘
        —PRINT @sql
     EXEC (@sql)
    end    
    IF(isnull(ltrim(rtrim(@sqlProcText)),’’)!=’’)
    BEGIN
       —执行更新存储过程内容
  SET @sql =
  ‘ BEGIN TRY  use ‘+@dbname +CHAR(13)+
      ‘ declare @innerSql varchar(max)
     set @innerSql = ‘’ ‘+@sqlProcText+’ ‘’
     exec(@innerSql)    
      ‘+
  ‘ END TRY
    BEGIN CATCH
    SELECT   db_name() as dbname,ERROR_MESSAGE() AS ErrorMessage ,
      ERROR_SEVERITY() AS ErrorSeverity ,
      ERROR_STATE() AS ErrorState    
    END CATCH ‘  
  —PRINT @sql
  EXEC (@sql)      
    end  
    SET @i = @i+1
END
