Sql-Server

從文本和圖像遷移到 varchar(max) 和 varbinary(max)

  • June 29, 2015

我有一個 SQL Server 數據庫,其中包含許多imagetext列,我正在研究將它們遷移到未棄用的對應物varbinary(max)varchar(max).

除了更改應用程式碼之外,我主要關心的是與此相關的潛在“陷阱”。例如,是否有舊數據類型支持但新數據類型不支持的功能?

至少由於截斷導致的數據失去似乎不是問題,因為新類型至少與舊類型一樣大。

請注意:這些新數據類型支持與它們所取代的已棄用類型相同的大小,例如 2GB 數據(這意味著不同數量的字元取決於 Unicode 和其他因素)。

可以肯定的一件事是,您應該解析所有現有的應用程式碼、儲存過程、函式等,以獲取諸如UPDATETEXTREADTEXTTEXTPTRWRITETEXT和- 所有這些都可能需要更改的內置實例。您可以通過以下方式辨識儲存在 SQL Server 中的那些:TEXTSIZE``@@TEXTSIZE

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%';

請注意,這可能會產生誤報(例如,這些術語可能在評論中或自然出現在實體名稱中)並且可能會遺漏一些(例如,可以使用參數/動態 SQL 構造命令)。您需要自行搜尋應用程式碼庫和/或原始碼控制以獲取相同的實例。

還要確保找到所有接受或輸出這些類型參數的模組:

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);

您可能還需要考慮,由於這些數據類型固有的限制,您可能在作業和其他維護常式中具有目前避免這些表或以不同方式對待它們的邏輯。當您遷移到較新的類型時(尤其是在最現代的 SQL Server 版本上),很多這些限制都會消失。

最後,除了上面的語法,我想不出舊類型支持而新類型不支持的單一特性。

引用自:https://dba.stackexchange.com/questions/105471