I have like 80 Databases. they have differents collates.
What i need? everyone with the same collation.
What i have?
USE [COLLATE_ADM]
GO
SET ANSI_NULLS ON GO
SET QUOTED_IDENTIFIER ON GO
CREATE PROCEDURE [dbo].[PR_COLLATE3] AS
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 Select name into #tmp from
aster.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 + ''] -> '' +
.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
.max_length != -1
THEN CAST(c.max_length / 2 AS VARCHAR(10))
WHEN t.name IN (''nchar'', ''nvarchar'') AND
.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
.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
it lists the script to all databases ( to change table collate and etc. ) but im facing LOTS of problemas.
PK is reference of another table. IX is reference.
So I need to drop EVERYTHING and create again ( functions too ) .
Is there a easy way to do this??
I have scrits to list the pks and fks but i think this is DANGEROUS.
Aucun commentaire:
Enregistrer un commentaire