sql - 更改列类型是否会破坏列的现有数据?

我正在尝试更改列的数据类型。 VARCHAR 类型的列具有数千个 GUID values,如下所示:

b1f4ff32-48d4-494e-a32c-044014cea9
bc5a1158-b310-49ff-a1f3-09d4f8707f69
4b7ebc9d-9fa1-42d9-811e-0b7b4b7297a
fc7ba848-98ea-4bc6-add7-11f0ee9c6917a21
485741ff-2ab2-4705-91b3-136389948b7c

我需要使用下面的脚本将列类型转换为 unqiqueidentifier。我可以在不破坏列数据的情况下安全地做到这一点吗?

alter table MyTable
alter column guidColumn uniqueidentifier not null

回答1

如果更改数据类型 SQL 服务器将首先检查列中的所有 values 是否可以隐式转换为新的数据类型;如果他们不能,那么 ALTER 将失败。如果可以,那么它们将被隐式转换并且 ALTER 将成功(当然假设没有依赖关系)。

对于 uniqueidentifier 那么它要么是有效的 value 要么不是,所以要么数据将全部转换,要么 ALTER 不会发生。但是,对于像 date 和 time 数据类型这样的数据,如果数据以像 dd/MM/yyyy 这样的模棱两可的格式存储,您很容易得到不正确的数据。这可能意味着像 '12/05/2022' 这样的 value 最终会被存储为 date value 2022-12-05 而不是 2022-05-12。因此,对于这种情况,您需要先将数据 UPDATE 转换为明确的格式,然后再将数据转换为 ALTER 列的数据类型。

回答2

为了从字符表达式转换的目的,uniqueidentifier 类型被视为字符类型,因此受制于转换为字符类型的截断规则。

也有限制,uniqueidentifier 类型限制为 36 个字符

因此,如果您决定像本例中那样截断 table :

DECLARE @ID NVARCHAR(max) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong';  

SELECT @ID, CONVERT(uniqueidentifier, @ID) AS TruncatedValue;

这将是结果:

String Truncated Value
0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong 0E984725-C51C-4BF4-9960-E1C80E27ABA0

因此,如果您的字符串大于或小于 36,它将无法正确截断。

有关详细信息,请查看 Microsoft 文档:https://docs.microsoft.com/en-us/sql/t-sql/data-types/uniqueidentifier-transact-sql?view=sql-server-ver15

相似文章