我想分享一下我在转换过程中的经验。在我的古老的Linq2SQL代码中,有许多text
字段。这是为了允许索引中存在text
列时进行在线重建。
首先,多年来我一直知道这样做的好处,但我总是认为转换意味着要运行一些可怕的长查询,SQL Server将必须重建表并复制所有内容,从而使我的网站崩溃并提高我的心率。
我也担心Linq2SQL如果正在执行某种列类型的验证,则可能会导致错误。
很高兴地报告,ALTER命令立即返回 - 因此它们肯定只改变表元数据。可能会有一些离线工作来将小于8000个字符的数据带回到表内,但ALTER命令是瞬间完成的。
我运行以下命令查找所有需要转换的列:
SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] VARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'TEXT' order by table_name, column_name
SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] NVARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'NTEXT' order by table_name, column_name
这给了我一个不错的查询列表,我只需选择并将其复制到新窗口中。就像我说的一样 - 运行这个是瞬间的。
![enter image description here](https://istack.dev59.com/peJI8.webp)
Linq2SQL 相当古老了 - 它使用一个设计器让你将表拖放上去。对于 EF Code first,情况可能更加复杂,但我还没有解决这个问题。