Migration von Text und Bild zu varchar (max) und varbinary (max)

8

Ich habe eine SQL Server - Datenbank , die eine Anzahl enthält imageund textSpalten, und ich studiere potenzielle Probleme , die eine Migration von ihnen zu ihren nicht-veralteten Pendants entstehen könnten varbinary(max)und varchar(max).

Abgesehen von Änderungen am Anwendungscode sind meine Hauptanliegen potenzielle "Fallstricke", die damit verbunden sind. Gibt es beispielsweise Funktionen, die von den älteren Datentypen unterstützt werden, jedoch nicht von den neuen?

Datenverlust aufgrund von Kürzungen scheint zumindest kein Problem zu sein, da die neuen Typen mindestens so groß sind wie die alten.

Zusammenfluss
quelle

Antworten:

11

Nur ein Hinweis: Diese neuen Datentypen unterstützen die gleichen Größen wie die veralteten Typen, die sie ersetzen, z. B. 2 GB Daten (was je nach Unicode und anderen Faktoren eine unterschiedliche Anzahl von Zeichen bedeutet).

Eines ist sicher : Sie alle Ihre bestehenden Anwendungscode analysieren sollte, gespeicherte Prozeduren, Funktionen usw. für Instanzen von Einbauten wie UPDATETEXT, READTEXT, TEXTPTR, WRITETEXT, TEXTSIZEund @@TEXTSIZE- all das wahrscheinlich geändert werden muss. Sie können die in SQL Server gespeicherten auf folgende Weise identifizieren:

SELECT s.name, o.name
  FROM sys.sql_modules AS m
  INNER JOIN sys.objects AS o
  ON m.[object_id] = o.[object_id]
  INNER JOIN sys.schemas AS s
  ON o.[schema_id] = s.[schema_id]
  WHERE UPPER(m.definition) LIKE N'%UPDATETEXT%'
     OR UPPER(m.definition) LIKE N'%WRITETEXT%'
     OR UPPER(m.definition) LIKE N'%READTEXT%'
     OR UPPER(m.definition) LIKE N'%TEXTPTR%'
     OR UPPER(m.definition) LIKE N'%TEXTSIZE%';

Beachten Sie, dass dies zu falsch positiven Ergebnissen führen kann (z. B. können diese Begriffe in einem Kommentar enthalten sein oder natürlich in einem Entitätsnamen vorkommen) und einige fehlen (z. B. können die Befehle mithilfe von Parametern / dynamischem SQL erstellt werden). Sie sind allein, um Ihre Anwendungscodebasis und / oder Quellcodeverwaltung nach Instanzen derselben zu durchsuchen.

Stellen Sie außerdem sicher, dass Sie alle Module finden, die Parameter dieser Typen akzeptieren oder ausgeben:

SELECT DISTINCT s.name, o.name
  FROM sys.parameters AS p
  INNER JOIN sys.objects AS o
  ON p.[object_id] = o.[object_id]
  INNER JOIN sys.schemas AS s
  ON o.[schema_id] = s.[schema_id]
  WHERE system_type_id IN (34,35,99);

Möglicherweise möchten Sie auch berücksichtigen, dass in Jobs und anderen Wartungsroutinen möglicherweise Logik vorhanden ist, die diese Tabellen derzeit vermeiden oder aufgrund der mit diesen Datentypen verbundenen Einschränkungen anders behandeln. Wenn Sie zu den neueren Typen wechseln (und insbesondere zu den modernsten Versionen von SQL Server), verschwinden viele dieser Einschränkungen.

Abgesehen von der obigen Syntax kann ich mir kein einziges Feature vorstellen, das die alten Typen unterstützen, das die neuen Typen nicht unterstützen.

Aaron Bertrand
quelle
2

Wir haben dies ohne Probleme durchlaufen. Stellen Sie überall dort, wo Sie Daten aktualisieren oder einfügen, sicher, dass es sich um eine herkömmliche Einfügung / Aktualisierung handelt und dass Sie WRITETEXT oder UPDATETEXT nicht verwenden.
Ansonsten sollte alles gut funktionieren.

Vic Ambruso
quelle