SQL Server - Skript Datenbankspalten von Varchar zu aktualisieren bereits Nvarchar wenn nicht nvarchar

StackOverflow https://stackoverflow.com/questions/179987

  •  05-07-2019
  •  | 
  •  

Frage

Ich bin in einer Situation, wo ich eine vorhandene Datenbankstruktur von varchar aktualisieren muß mit einem Skript Nvarchar. Da dieses Skript ausgeführt wird jedes Mal eine Konfigurationsanwendung ausgeführt wird, würde ich lieber bestimmen, ob eine Spalte bereits ein ändern, um nvarchar und nicht ausführen auf dem Tisch geändert wurde. Die Datenbanken, die ich unterstützen müssen, sind SQL Server 2000, 2005 und 2008.

War es hilfreich?

Lösung

Die folgende Abfrage sollten Sie bekommen, was Sie brauchen:

IF EXISTS 
  (SELECT *
   FROM sysobjects syo
   JOIN syscolumns syc ON
     syc.id = syo.id
   JOIN systypes syt ON
     syt.xtype = syc.xtype
   WHERE 
     syt.name = 'nvarchar' AND
     syo.name = 'MY TABLE NAME' AND
     syc.name = 'MY COLUMN NAME')
BEGIN
   ALTER ...
END

Andere Tipps

Sie können das folgende Skript ausführen, die Ihnen eine Reihe von ALTER-Befehle:

SELECT 'ALTER TABLE ' + isnull(schema_name(syo.id), 'dbo') + '.' +  syo.name 
    + ' ALTER COLUMN ' + syc.name + ' NVARCHAR(' + case syc.length when -1 then 'MAX' 
        ELSE convert(nvarchar(10),syc.length) end + ');'
   FROM sysobjects syo
   JOIN syscolumns syc ON
     syc.id = syo.id
   JOIN systypes syt ON
     syt.xtype = syc.xtype
   WHERE 
     syt.name = 'varchar' 
    and syo.xtype='U'

Es gibt jedoch ein paar schnelle Einsprüche für Sie.

  1. Dies wird nur Tabellen tun. Sie wollen alle Ihre sprocs und Funktionen scannen, um sicherzustellen, dass sie geändert werden auch NVARCHAR.
  2. Wenn Sie eine VARCHAR> 4000 haben, müssen Sie es ändern zu NVARCHAR(MAX)

Aber diese sollten mit dieser Vorlage leicht machbar sein.

Wenn Sie dies wollen, automatisch ausführen Sie es in einer WHILE Klausel festlegen.

Das Problem mit Antwort Josefs ist, dass es NOT NULL Felder nach der Ausführung der Anfragen an NULL ändern würde. Die folgende Manipulation behebt es:

SELECT cmd = 'alter table [' + c.table_schema + '].[' + c.table_name 
 + '] alter column [' + c.column_name + '] nvarchar('
 +CASE WHEN CHARACTER_MAXIMUM_LENGTH<=4000
       THEN CAST(CHARACTER_MAXIMUM_LENGTH as varchar(10)) ELSE 'max' END+')' 
 + CASE WHEN IS_NULLABLE='NO' THEN ' NOT NULL' ELSE '' END,*
FROM information_schema.columns c
WHERE c.data_type='varchar' 
ORDER BY CHARACTER_MAXIMUM_LENGTH desc
  

Credits zum Igor Antwort

den Raum Problem wurde behoben, und hinzugefügt Schema

SELECT 'ALTER TABLE [' + isnull(schema_name(syo.object_id), sysc.name) + '].[' +  syo.name 
    + '] ALTER COLUMN ' + syc.name + ' NVARCHAR(' + case syc.max_length when -1 then 'MAX' 
        ELSE convert(nvarchar(10),syc.max_length) end + ');'
   FROM sys.objects syo
   JOIN sys.columns syc ON
     syc.object_id= syo.object_id
   JOIN sys.types syt ON
     syt.system_type_id = syc.system_type_id
    JOIN sys.schemas sysc ON
    syo.schema_id=sysc.schema_id
   WHERE 
     syt.name = 'varchar' 
    and syo.type='U'

Weitere aktualisiert MAX beheben mit -1 ersetzt.

SELECT cmd = 'ALTER TABLE [' + c.table_schema + '].[' + c.table_name 
 + '] ALTER COLUMN [' + c.column_name + '] NVARCHAR('
 +CASE WHEN CHARACTER_MAXIMUM_LENGTH<=4000 THEN 
 CASE WHEN CHARACTER_MAXIMUM_LENGTH = -1 THEN
 'MAX' ELSE CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR(10)) END ELSE 'MAX' END+')' 
 + CASE WHEN IS_NULLABLE='NO' THEN ' NOT NULL' ELSE '' END,*
FROM information_schema.columns c
WHERE c.data_type='VARCHAR' 
ORDER BY CHARACTER_MAXIMUM_LENGTH DESC

Kredit Nezam Antwort-

Und ein anderer Standardwert verwalten:

SELECT cmd = 
CASE WHEN name IS NOT NULL THEN
    'ALTER TABLE ' + c.table_name + ' DROP CONSTRAINT ' + d.name + '; ' +
    'ALTER TABLE [' + c.table_schema + '].[' + c.table_name + '] ALTER COLUMN [' + c.column_name + '] ' + 
    'NVARCHAR(' +
    CASE WHEN CHARACTER_MAXIMUM_LENGTH <= 4000 THEN 
        CASE WHEN CHARACTER_MAXIMUM_LENGTH = -1 THEN
            'MAX' 
        ELSE 
            CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR(10)) 
        END 
     ELSE 
        'MAX' 
    END 
    + ')' +
    CASE WHEN IS_NULLABLE='NO' THEN ' NOT NULL' ELSE '' END + '; ' + 
    'ALTER TABLE '+ c.table_name + ' ADD CONSTRAINT ' + d.name +' DEFAULT '+ c.column_default + ' FOR ' + c.column_name + ';'
ELSE
    'ALTER TABLE [' + c.table_schema + '].[' + c.table_name + '] ALTER COLUMN [' + c.column_name + '] ' +
    'NVARCHAR(' +
    CASE WHEN CHARACTER_MAXIMUM_LENGTH<=4000 THEN
        CASE WHEN CHARACTER_MAXIMUM_LENGTH = -1 THEN
            'MAX' 
        ELSE 
            CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR(10)) 
        END 
    ELSE 
        'MAX' 
    END
    + ')' +
    CASE WHEN IS_NULLABLE='NO' THEN ' NOT NULL' ELSE '' END 
END,d.name, c.*
FROM information_schema.columns c
LEFT OUTER JOIN sys.default_constraints d ON d.parent_object_id = object_id(c.table_name)
AND d.parent_column_id = columnproperty(object_id(c.table_name), c.column_name, 'ColumnId')
WHERE c.data_type='VARCHAR' 
ORDER BY CHARACTER_MAXIMUM_LENGTH DESC
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top