在 SQL Server 中将文本与 varchar(MAX) 互相转换

27

我只有对 SQL Server 2008 R2 数据库的只读访问权限,我需要把其中某些表的数据复制到我的数据库中;两个数据库具有相同的排序规则。

源数据库使用了很多 text 类型的列。我能否安全地将目标数据库中的列设置为 varchar(MAX) 类型并且在不产生任何风险的情况下复制数据(我正在使用 INSERT 语句复制数据)?

换句话说,我能否安全地从 text 类型的列复制字符串数据到 varchar(MAX) 类型的列?两个列使用了相同的排序规则。


1
注意:经过多年的警告,微软实际上已经在云端的“Sql Data Warehouse”中删除了TEXT类型。它仍然适用于“Azure SQL Database”,但是超高端的数据仓库已将其删除:https://learn.microsoft.com/en-us/azure/sql-data-warehouse/sql-data-warehouse-tables-data-types - Simon_Weaver
1个回答

46

是的,绝对没问题 - 你应该使用 VARCHAR(MAX) 类型。两种类型的底层实现本质上是相同的(在足够大的数据或从文本到 VARCHAR(MAX) 的类型更改后),如果你担心这个问题。

你甚至可以通过以下方式“转换”现有的 TEXT 类型列为 VARCHAR(MAX)

ALTER TABLE dbo.YourTableHere
ALTER COLUMN YourTextColumnHere VARCHAR(MAX)

这将把你的TEXT列转换成一个VARCHAR(MAX)列,而不会有任何数据丢失。

试试看吧!(当然,先在现有数据库的副本上尝试


2
是的,它是安全的。NVARCHAR(max)不是NVARCHAR(4000)。使用NVARCHAR(max)没有长度限制。 - Jirka Hanika
1
好的。这是一个简单的测试。像这样:DECLARE @text VARCHAR(MAX);SET @text=REPLICATE('0,',200000);SELECT DATALENGTH(@text);。你能解释一下为什么DATALENGTH返回8000吗? - Arion
1
@marc_s - 你说得对,我写这篇文章的时候就是考虑到了这个特定的任务。所以总结一下:NVARCHAR(MAX) 就是 NVARCHAR(1000000000),并且对于那些适合存储在 NVARCHAR(4000) 中的数据进行了性能优化:这样短的数据会以 NVARCHAR 的方式内联存储,而更大的数据则以类似 NTEXT 的方式存储为 BLOB。 - Jirka Hanika
3
@Arion - “REPLICATE”效果是由于你的'0,'字符串类型引起的(向后兼容的行为)。以下代码可以成功生成大量数据:REPLICATE(CAST('0,' as NVARCHAR(MAX)), 200000))。这里不涉及SSMS。 - Jirka Hanika
我还没弄明白为什么SQL Management Studio在更改列数据类型时感觉需要删除并重新创建表。我本以为脚本生成会变得更智能一些。 - Jerad Rose
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接