rene1976
Goto Top

Semi-automatisches umstellen von CHAR in NVARCHAR Felder im SQL Server 2008

Hallo DB-Profis,

kennt jemand ein Tool, mit dem man schnell semi-automatisches Datenfelder z.B. von CHAR in NVARCHAR Felder im SQL Server 2008 umstellen kann.

Am besten wäre ein Tool, das mir alle Felder mit einem bestimmten Datentyp aus allen Tabellen einer DB anzeigen kann.
Dann sollte der DB Admin mit den Programmierer die Entscheidung fällen, welche Felder nacheinander umgestellt werden sollen / können.
Am besten wäre es natürlich, wenn nach der Auswahl das Feld bei Bedarf auch automatisch "getrimmt" werden kann.
Am Ende sollte auch noch ein Protokoll geschrieben werden, um die Änderungen später nachvollziehen zu können.

Kennt jemand so ein Tool mit dem man das effizient machen kann, bzw. das uns unterstützen kann?

Wir haben ca. 1500 alte CHAR Felder die mit der Zeit SICHER umgestellt werden sollen.


Vorweg:
Wir wissen was wir tun wollen und warum wir das tun wollen und wollen hier keine philosophische Debatte über den Sinn lostreten.
Wir haben auch schon oft Felder einzeln von Hand umgestellt und sind uns möglicher Konsequenzen bewusst und haben diese auch immer gemeistert.
Und natürlich soll die Umstellung auch ein Entwickler überwachen, der diese Felder angelegt hat, bzw. die Auswirkungen kennt / abschätzen kann.

Wir versprechen uns anschießend dadurch einige Erleichterungen bei der Programmierung, z.B.:

- weniger Trim Befehle im Code (werden gerne mal vergessen face-wink)
- einfachere Spaltenvergleich über mehrere Tabellen hinweg (alte CHAR Tabellen mit neuen NVCHAR Tabellen)
- ...

Gerne würden wir auch die ntext Felder so loswerden und auf die neue Alternative nvarchar(Wert) umstellen um auch dort endlich SQL Befehle wie "order by" etc. verwenden zu können.

Besten Dank für euer Feedback.

Rene

Content-Key: 192003

Url: https://administrator.de/contentid/192003

Printed on: April 16, 2024 at 10:04 o'clock

Member: MadMax
MadMax Oct 01, 2012 at 15:59:22 (UTC)
Goto Top
Hallo Rene,

ein Tool in dem Sinne kann ich Dir nicht nennen, aber die Aufgabe läßt sich recht einfach über die Systemtabellen oder auch Information_Schema-Sichten erledigen.

Eine Liste der char-Spalten erhältst Du z.B. über die Sicht information_schema.columns:
select	*
from	information_schema.columns
where	objectproperty (object_id (table_name), 'IsUserTable') = 1 and data_type = 'char'  
order by table_name, ordinal_position

Und über diese Sichten kannst Du Dir auch Skripte zusammenstellen, die die Spalten abändern:
select	'alter table ' + quotename (table_name) + ' alter column ' + quotename (column_name) + ' nvarchar (' + convert (varchar (5), character_maximum_length) + ') ' + case is_nullable when 'NO' then 'not null' else 'null' end   
from	information_schema.columns
where	objectproperty (object_id (table_name), 'IsUserTable') = 1 and data_type = 'char'  
order by table_name, ordinal_position

Kann sein, daß in den Information_Schema-Sichten nicht alle Informationen drin sind, dann kann man auch auf die Systemtabellen zugreifen (sys.columns, sys.tables, sys.types, ...).

Gruß, Mad Max
Member: Rene1976
Rene1976 Oct 02, 2012 at 11:01:18 (UTC)
Goto Top
Hi Max,

vielen Dank für die Antwort. Ich werde es mal so ausprobieren.

Weiß du ob der SQL Server irgendwo auch abgespeichert hat, wann einen Spalte in einer Tabelle neu angelegt wurde, bzw. wann ihr Datentyp geändert wurde.
Gibt es so ein Protokoll?

Grüße,

Rene
Member: MadMax
MadMax Oct 02, 2012 at 17:20:44 (UTC)
Goto Top
Hallo Rene,

soweit ich weiß, gibt es diese Information nicht. Für Tabellen oder andere Objekte gibt es diese Angabe aber für einzelne Spalten nicht.

Gruß, Mad Max