0

朋友们。

在(上一篇文章)中,我们试图改变所有数据库和表等的排序。

这就是我所做的:

  begin   

DECLARE @collate SYSNAME  
SELECT @collate = 'Latin1_General_CI_AS'           

declare @cmd as nvarchar(4000)             
declare @banco as varchar(100)             

 -- Bancos que serão consultados ( DBS WILL BE CONSULTED )             
Select name into #tmp from master.sys.databases Where name not in ('master', 'model', 'msdb',
 'tempdb')              


 --while   
 -- Loop pelos bancos              
 While (Select count(1) from #tmp) > 0             
  begin         
 Select @banco = min(name) from #tmp             

        set @cmd = '  
 use [' + @banco + ' ]  


        insert into collate_adm.dbo.tblCollateScript  

        SELECT ''?'' as Banco,  
                ''['' + SCHEMA_NAME(o.[schema_id]) + ''].['' + o.name + ''] -> '' + c.name  
              , '' use [' + @banco + ' ] alter database  '+@banco+' set single_user 
                ALTER DATABASE  '+@banco+ '  COLLATE Latin1_General_CI_AS
                ALTER DATABASE '+@banco+' SET MULTI_USER
                             ALTER TABLE     ['' + SCHEMA_NAME(o.[schema_id]) + ''].['' + o.name +
  '']  
                    ALTER COLUMN ['' + c.name + ''] '' +  
                    UPPER(t.name) +  
                    CASE WHEN t.name NOT IN (''ntext'', ''text'')  
                         THEN ''('' +  
                               CASE  
                                     WHEN t.name IN (''nchar'', ''nvarchar'') AND c.max_length !=
 -1  
                                           THEN CAST(c.max_length / 2 AS VARCHAR(10))  
                                     WHEN t.name IN (''nchar'', ''nvarchar'') AND c.max_length = 
 -1  
                                           THEN ''MAX''  
                                     ELSE CAST(c.max_length AS VARCHAR(10))  
                               END + '')''  
                         ELSE ''''  
                    END + '' COLLATE Latin1_General_CI_AS '' +  
                    CASE WHEN c.is_nullable = 1  
                         THEN '' NULL''  
                         ELSE '' NOT NULL''  
                    END  
        FROM sys.columns c WITH(NOLOCK)  
        JOIN sys.objects o WITH(NOLOCK) ON c.[object_id] = o.[object_id]  
        JOIN sys.types t WITH(NOLOCK) ON c.system_type_id = t.system_type_id AND c.user_type_id =
  t.user_type_id  
        WHERE t.name IN (''char'', ''varchar'', ''text'', ''nvarchar'', ''ntext'', ''nchar'')  
                               AND o.[type] = ''U''  
        '  



  set @cmd = replace(replace(@cmd,'?', @banco) , 'XXXcollateXXX', @collate)  


  begin try             
        exec sp_executeSQL @cmd -- Executa comando gerado pelo script             
  end try    
  begin catch             
        insert into tblCollateScript (rotina, script,Data) values ('pr_BuscaCotas', @cmd, 
GETDATE())              
  end catch                    

 Delete from #tmp Where name = @banco             
 end             

 drop table #tmp             
end      

GO

它会告诉我这样的事情:

 use [br_teste ] alter database  br_teste set single_user                       ALTER DATABASE   
 br_teste  COLLATE Latin1_General_CI_AS                      ALTER DATABASE br_teste SET   
 MULTI_USER                                   ALTER TABLE     [dbo.]
 [Participants_BR140515850101_HistoryTable]                            ALTER COLUMN [SampleId] 
 NVARCHAR(64) COLLATE Latin1_General_CI_AS  NULL

这将遍历所有数据库和所有表。这就是我要的。

但我有时会发现这个错误:

消息 5074,级别 16,状态 1,第 112 行对象“IX_CTTrace_Unique”依赖于列“TraceName”。消息 4922,级别 16,状态 9,第 112 行 ALTER TABLE ALTER COLUMN TraceName 失败,因为一个或多个对象访问此列。

我怎么能打这个?因为有很多这样的消息,我们有数百个操作系统数据库和表以及 Pks...

这是胜利的最后一条线!!我的老板终于会说“嘿……干得好,我的朋友……”

我找到了这个答案:

啊,这是 SQL Server 中最严重的问题之一:一旦创建了对象,就无法更改排序规则(对于表和数据库都是如此……)。您只能保存数据(不要使用 bcp 或备份实用程序,您需要将它们放在类似文件类型的 csv 中......),删除数据库,使用正确的排序规则重新创建并将数据重新导入到新数据库...希望这会有所帮助,再见 cghersi

我不想放弃。2 个月的 DBA,我想变得很棒。

谢谢朋友 !

4

0 回答 0