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 は、1 つ以上のオブジェクトがこの列にアクセスしているため、失敗しました。

どうすればこれと戦うことができますか?このメッセージが大量にあり、何百もの OS データベースとテーブル、および Pks があるためです...

勝利への最終ラインだ!! 私の上司はついに「やあ... よくやった、私の友人...」と言うだろう.

私が見つけたこの答えがあります:

ああ、これは SQL Server の最悪の問題の 1 つです。オブジェクトが作成されると、照合順序を変更できません (これは、テーブルとデータベースの両方に当てはまります...)。データのみを保存し (bcp やバックアップ ユーティリティを使用しないでください。同様のファイル タイプの csv に配置する必要があります...)、データベースを削除し、正しい照合順序で再作成し、データを新しいデータベース...これが役に立てば幸いです、さようならcghersi

あきらめたくない。2 か月の DBA と私は素晴らしいになりたいです。

友よありがとう !

4

0 に答える 0