varios valores update una tabla registros registro otra modificar insertar datos como comando actualizar sql-server-2008

sql-server-2008 - valores - modificar un registro en mysql



Actualizar la compilaciĆ³n de todos los campos en la base de datos sobre la marcha (7)

De acuerdo, reescribí el código de edosoft y lo puse en un bucle para ejecutar las instrucciones T-SQL reales.

-- **************** BEGIN INPUT ********************** USE [YourDBName] DECLARE @collation NVARCHAR(128) -- enter you collation name below SET @collation = N''Latin1_General_CI_AS'' -- **************** END INPUT ************************ -- **************** BEGIN LOGIC ********************** DECLARE @sqlCode VARCHAR(2048) DECLARE myCursor CURSOR LOCAL FOR SELECT ''ALTER TABLE ['' + sys.objects.name + ''] ALTER COLUMN [''+ sys.columns.name + ''] '' + sys.types.name + CASE sys.types.name WHEN ''text'' THEN '' '' WHEN ''ntext'' THEN '' '' ELSE ''('' + RTRIM( CASE WHEN sys.columns.max_length = -1 THEN ''MAX'' WHEN sys.columns.max_length > 4000 THEN ''MAX'' ELSE CONVERT(CHAR,sys.columns.max_length) END) + '')'' END + '' COLLATE '' + @collation + CASE sys.columns.is_nullable WHEN 0 THEN '' NOT NULL'' ELSE '' NULL'' END FROM sys.columns , sys.objects , sys.types WHERE sys.columns.object_id = sys.objects.object_id AND sys.objects.TYPE = ''U'' AND sys.types.system_type_id = sys.columns.system_type_id AND sys.columns.collation_name IS NOT NULL AND sys.columns.collation_name <> @collation AND NOT ( sys.objects.NAME LIKE ''sys%'' ) AND NOT ( sys.types.name LIKE ''sys%'' ) OPEN myCursor FETCH NEXT FROM myCursor INTO @sqlCode WHILE @@FETCH_STATUS = 0 BEGIN PRINT ''Executing: '' + @sqlCode BEGIN TRY EXEC(@sqlCode); PRINT ''Done!'' + CHAR(10) END TRY BEGIN CATCH PRINT ''Error: '' + ERROR_MESSAGE() + CHAR(10) END CATCH FETCH NEXT FROM myCursor INTO @sqlCode END PRINT ''Finished!'' -- **************** END LOGIC **********************

Si obtiene el error, algo similar a "No se puede crear una fila de tamaño 8075 que sea mayor que el tamaño de fila máximo permitido de 8060". Vuelva a generar la tabla para la que obtiene el error y vuelva a ejecutar el script anterior.

ALTER TABLE [dbo].[YourTableName] REBUILD

Recientemente cambiamos nuestra base de datos de nuestro servidor SQL Server 2005 a nuestro servidor SQL Server 2008. Todo se movió demasiado bien, sin embargo, ahora estamos descubriendo que estamos obteniendo conflictos de intercalación. El servidor anterior tenía una intercalación diferente con el nuevo servidor.

Ahora nuestras tablas creadas antes del movimiento son una intercalación, y las creadas después son otra intercalación.

¿Hay alguna manera de actualizar las tablas / columnas con la antigua intercalación con la nueva intercalación?

Entiendo que configurar la intercalación de base de datos / servidor por defecto no modifica ninguna tabla existente (link) . Realmente no quiero recrear la base de datos si no es necesario.

Cualquier ayuda realmente apreciada.

ACTUALIZAR

Gracias por su ayuda chicos, finalmente lo puso a trabajar.

Para referencia futura, aquí está mi script final:

SELECT ''ALTER TABLE ['' + SYSOBJECTS.Name + ''] ALTER COLUMN ['' + SYSCOLUMNS.Name + ''] '' + SYSTYPES.name + CASE systypes.NAME WHEN ''text'' THEN '' '' ELSE ''('' + RTRIM(CASE SYSCOLUMNS.length WHEN -1 THEN ''MAX'' ELSE CONVERT(CHAR,SYSCOLUMNS.length) END) + '') '' END + '' '' + '' COLLATE Latin1_General_CI_AS '' + CASE ISNULLABLE WHEN 0 THEN ''NOT NULL'' ELSE ''NULL'' END FROM SYSCOLUMNS , SYSOBJECTS , SYSTYPES WHERE SYSCOLUMNS.ID = SYSOBJECTS.ID AND SYSOBJECTS.TYPE = ''U'' AND SYSTYPES.Xtype = SYSCOLUMNS.xtype AND SYSCOLUMNS.COLLATION IS NOT NULL AND NOT ( sysobjects.NAME LIKE ''sys%'' ) AND NOT ( SYSTYPES.name LIKE ''sys%'' ) GO

Aquí está el site que contenía el script en el que lo basé. Tuve que modificarlo para que funcione correctamente.


El código no puede tener en cuenta los bytes dobles NText, NChar y NVarchar. Si tiene NText, fallará con Ntext (16) incapaz de establecer el tamaño en NText.

Para NChar y NVarChar dobla la longitud, porque no puede dividir el tamaño entre 2.

Otro pequeño detalle extravagante, es que para Nvarchar al menos, -1 no es MAX, pero 0 es.

Este es un truco muy feo en el código, solo para ilustrar los problemas:

ALTER TABLE [BlanketBruger] ALTER COLUMN [BrugerNavn] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ALTER TABLE [BlanketBruger] ALTER COLUMN [BrugerFuldNavn] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ALTER TABLE [blanketgruppe] ALTER COLUMN [GruppeNavn] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ALTER TABLE [blanketSerie] ALTER COLUMN [SerieTitel] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ALTER TABLE [blanketSerie] ALTER COLUMN [SerieAlias] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ALTER TABLE [FormUse] ALTER COLUMN [HostName] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ALTER TABLE [BackendLog] ALTER COLUMN [value1] nvarchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ALTER TABLE [BackendLog] ALTER COLUMN [value2] nvarchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ALTER TABLE [BackendLog] ALTER COLUMN [ip] varchar(20) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ALTER TABLE [BackendLog] ALTER COLUMN [username] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ALTER TABLE [BackendLog] ALTER COLUMN [gruppenavn] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ALTER TABLE [BackendLog] ALTER COLUMN [scriptname] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ALTER TABLE [BackendLog] ALTER COLUMN [querystring] nvarchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ALTER TABLE [BackendLog] ALTER COLUMN [useragent] nvarchar(400) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ALTER TABLE [BackendLog] ALTER COLUMN [sessionid] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ALTER TABLE [BackendLog] ALTER COLUMN [htmlcontent] nvarchar(MAX) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ALTER TABLE [frontendlog] ALTER COLUMN [value1] nvarchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ALTER TABLE [frontendlog] ALTER COLUMN [value2] nvarchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ALTER TABLE [frontendlog] ALTER COLUMN [ip] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ALTER TABLE [frontendlog] ALTER COLUMN [querystring] nvarchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ALTER TABLE [frontendlog] ALTER COLUMN [useragent] nvarchar(400) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ALTER TABLE [frontendlog] ALTER COLUMN [sessionid] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ALTER TABLE [log4net] ALTER COLUMN [Thread] varchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ALTER TABLE [log4net] ALTER COLUMN [Level] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ALTER TABLE [log4net] ALTER COLUMN [Logger] varchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ALTER TABLE [log4net] ALTER COLUMN [Message] text COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ALTER TABLE [log4net] ALTER COLUMN [Exception] varchar(MAX) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ALTER TABLE [log4net] ALTER COLUMN [Server] varchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ALTER TABLE [OioSamlLog] ALTER COLUMN [Server] varchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ALTER TABLE [OioSamlLog] ALTER COLUMN [Thread] varchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ALTER TABLE [OioSamlLog] ALTER COLUMN [Level] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ALTER TABLE [OioSamlLog] ALTER COLUMN [Message] varchar(MAX) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ALTER TABLE [BlanketSubmitTemp] ALTER COLUMN [FileContentIdentifier] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ALTER TABLE [BlanketSubmitTemp] ALTER COLUMN [FileContent] ntext COLLATE SQL_Latin1_General_CP1_CI_AS NULL ALTER TABLE [BlanketSubmitTemp] ALTER COLUMN [FileName] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL


En caso de que alguien mire esto está usando SQL Server 2008, tuve que hacer un par de modificaciones:

SELECT ''ALTER TABLE ['' + sys.objects.name + ''] ALTER COLUMN ['' + sys.columns.name + ''] '' + sys.types.name + CASE sys.types.name WHEN ''text'' THEN '' '' ELSE ''('' + RTRIM(CASE sys.columns.max_length WHEN -1 THEN ''MAX'' ELSE CONVERT(CHAR,sys.columns.max_length) END) + '') '' END + '' '' + '' COLLATE Latin1_General_BIN '' + CASE sys.columns.is_nullable WHEN 0 THEN ''NOT NULL'' ELSE ''NULL'' END FROM sys.columns , sys.objects , sys.types WHERE sys.columns.object_id = sys.objects.object_id AND sys.objects.TYPE = ''U'' AND sys.types.system_type_id = sys.columns.system_type_id AND sys.columns.collation_name IS NOT NULL AND NOT ( sys.objects.NAME LIKE ''sys%'' ) AND NOT ( sys.types.name LIKE ''sys%'' )


Para solucionar este problema, necesita mucha más potencia de disparo que este script. Intenté el script y encontré problemas con objetos dependientes que no se pudieron actualizar: índices, claves y procedimientos. La solución final tomó solo 5 minutos con esta aplicación de proyecto de código. La aplicación dice que es para Sql Server 2000 pero lo utilicé con éxito en 2008.

http://www.codeproject.com/Articles/12753/SQL-Server-2000-Collation-Changer

No puedo enfatizar esto lo suficiente. RESPALDE SU BASE DE DATOS. Tuve que usar mi copia de seguridad tres veces para completar esta tarea.


Puede cambiar la intercalación de cualquier objeto nuevo que se cree en una base de datos de usuario utilizando la cláusula COLLATE de la sentencia ALTER DATABASE . Esta declaración no cambia la intercalación de las columnas en ninguna tabla existente definida por el usuario. Estos pueden cambiarse usando la cláusula COLLATE de ALTER TABLE .

Referencia: configuración y cambio de la intercalación de la base de datos

Si hay demasiadas columnas, puede recorrer las SYS.COLUMNS para aplicar la instrucción ALTER TABLE.


Qué tal si:

DECLARE @collation NVARCHAR(64) SET @collation = ''Latin1_General_CI_AS'' SELECT ''ALTER TABLE ['' + TABLE_SCHEMA + ''].['' + TABLE_NAME + ''] '' + ''ALTER COLUMN ['' + COLUMN_NAME + ''] '' + DATA_TYPE + ''('' + CASE CHARACTER_MAXIMUM_LENGTH WHEN -1 THEN ''MAX'' ELSE CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) END + '') '' + ''COLLATE '' + @collation + '' '' + CASE WHEN IS_NULLABLE = ''NO'' THEN ''NOT NULL'' ELSE ''NULL'' END FROM INFORMATION_SCHEMA.columns WHERE COLLATION_NAME IS NOT NULL AND COLLATION_NAME <> @collation


Una opción es usar un programa como Red Gate SQL Compare (estoy seguro de que hay otros también). Con él puedes generar archivos de script para tu esquema con colación incluida (asegúrate de activarlo en las opciones), luego haz una búsqueda / reemplazo en los archivos actualizándolos a la nueva intercalación, luego vuelve a compararlos con tu real base de datos.

En este punto, SQL Compare podrá aplicar esos cambios (o guardar los cambios en un archivo de script, si lo prefiere), y sus columnas existentes son todas correctas.

En teoría, usted podría hacer todo esto mientras se encuentre aún en el período de prueba, aunque sugeriría que es una buena herramienta para mantener, ya que hace que muchas tareas SQL sean más fáciles.