我正在尝试更改列的数据类型。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'
这样的值最终被存储为date
值2022-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;
结果如下:
字符串 | 截断值 | 0 e984725 c51c - 4 bf4 - 9960 e1c80e27aba0wrong | 0 e984725 c51c - 4 bf4 - 9960 e1c80e27aba0 |
---|