更改列类型是否会损坏列的现有数据?



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

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

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

对于uniqueidentifier,它要么是一个有效值,要么不是,所以要么数据全部转换,要么ALTER不会发生。但是,对于日期和时间数据类型,如果数据以不明确的格式(如dd/MM/yyyy)存储,则很容易得到不正确的数据。这可能意味着像'12/05/2022'这样的值最终被存储为date2022-12-05而不是2022-05-12。因此,在这种情况下,您需要首先将数据UPDATE为明确的格式,然后将列的数据类型ALTER

uniqueidentifierType被认为是从字符表达式转换为字符类型的一种字符类型,因此在转换为字符类型时受截断规则的约束。

也有限制,唯一标识符类型限制为36 char

所以如果你决定截断表,像下面的例子:

DECLARE @ID NVARCHAR(max) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong';  
SELECT @ID, CONVERT(uniqueidentifier, @ID) AS TruncatedValue;

结果如下:

tbody> <<tr>
字符串截断值
0 e984725 c51c - 4 bf4 - 9960 e1c80e27aba0wrong0 e984725 c51c - 4 bf4 - 9960 e1c80e27aba0

相关内容

  • 没有找到相关文章

最新更新