友達。
(前の投稿では、すべてのデータベースとテーブルなどの照合を変更しようとしていました。
これは私がしたことです:
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 と私は素晴らしいになりたいです。
友よありがとう !