Sql 如何将nvarchar转换为唯一标识符?

Sql 如何将nvarchar转换为唯一标识符?,sql,sql-server,uniqueidentifier,sqldatatypes,nvarchar,Sql,Sql Server,Uniqueidentifier,Sqldatatypes,Nvarchar,我有一个表(RPT.table1),其中包含从ArcGIS在线应用程序导出的数据。表中的一列(GlobalID)作为nvarchar(255)数据类型导出。在将此数据插入另一个表(CFAdmin.table2)之前,我需要将此列转换为uniqueidentifier数据类型 GlobalID列中的值曾经是唯一标识符,并且已经包含连字符(B4A6AA96-42DF-48D9-A3E0-4C7F88ED3E1D) 我试过使用 ALTER TABLE RPT.table1 ALTER COLUMN

我有一个表(
RPT.table1
),其中包含从ArcGIS在线应用程序导出的数据。表中的一列(GlobalID)作为
nvarchar(255)
数据类型导出。在将此数据插入另一个表(
CFAdmin.table2
)之前,我需要将此列转换为
uniqueidentifier
数据类型

GlobalID
列中的值曾经是唯一标识符,并且已经包含连字符(
B4A6AA96-42DF-48D9-A3E0-4C7F88ED3E1D

我试过使用

ALTER TABLE RPT.table1 
ALTER COLUMN GlobalID uniqueidentifier;
语句中插入

INSERT INTO CFAdmin.table2 (GlobalID)
    SELECT CAST(GlobalID AS uniqueidentifier)
    FROM RPT.table1;
对于这两种方法,我都会得到一个错误

Msg 8169,第16级,第2状态,第1行
从字符串转换为uniqueidentifier时,转换失败

我对SQL Server比较陌生,我猜有一个非常简单的解决方案


谢谢你的阅读

很可能是数据问题,而不是代码/语法问题。源表中可能存在作为唯一标识符无效的值。我将通过查看源表中的数据并试图找到导致错误的值来进行调查。查看此查询返回的内容:

Select GlobalID from RPT.table1 WHERE GlobalID NOT LIKE '________-____-____-____-____________'
(这些下划线模糊在一起,因此为了明确起见:8个下划线,破折号,4个下划线,破折号,4个下划线,破折号,4个下划线,破折号,12个下划线)

也许可以检查一下

Select GlobalID from RPT.table1 WHERE GlobalID IS NULL

很可能是数据问题,而不是代码/语法问题。源表中可能存在作为唯一标识符无效的值。我将通过查看源表中的数据并试图找到导致错误的值来进行调查。查看此查询返回的内容:

Select GlobalID from RPT.table1 WHERE GlobalID NOT LIKE '________-____-____-____-____________'
(这些下划线模糊在一起,因此为了明确起见:8个下划线,破折号,4个下划线,破折号,4个下划线,破折号,4个下划线,破折号,12个下划线)

也许可以检查一下

Select GlobalID from RPT.table1 WHERE GlobalID IS NULL

现有值至少包含一个无法转换的值。选择try_cast(GlobalID作为uniqueidentifier)为null的行以查找不可转换的值。然后决定你想如何继续。这可能是答案,而不仅仅是一条评论谢谢@DRich。你是对的,我有一个不可转换的价值。还学习了try_cast,它非常方便。谢谢你们两位@SMor以及现有值至少包含一个无法转换的值。选择try_cast(GlobalID作为uniqueidentifier)为null的行以查找不可转换的值。然后决定你想如何继续。这可能是答案,而不仅仅是一条评论谢谢@DRich。你是对的,我有一个不可转换的价值。还学习了try_cast,它非常方便。谢谢你们两位@SMor也是如此,它只会找到字符模式有效的值。仍然有许多值不是有效的唯一标识符,它们确实与此模式匹配。这只是一个起点。我认为@SMor的评论是一个更严格的解决方案。这只能在字符模式有效的地方找到值。仍然有许多值不是有效的唯一标识符,它们确实与此模式匹配。这只是一个起点。我认为@SMor的评论是一个更严格的解决方案。