【问题标题】:How do I convert a nvarchar to a uniqueidentifer?如何将 nvarchar 转换为 uniqueidentifier?
【发布时间】:2019-12-05 17:10:07
【问题描述】:

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

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

我尝试过使用

ALTER TABLE RPT.table1 
ALTER COLUMN GlobalID uniqueidentifier;

INSERT INTO 声明中

INSERT INTO CFAdmin.table2 (GlobalID)
    SELECT CAST(GlobalID AS uniqueidentifier)
    FROM RPT.table1;

这两种方法都会出错

消息 8169,第 16 级,状态 2,第 1 行
从字符串转换为唯一标识符时转换失败。

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

感谢阅读。

【问题讨论】:

  • 您现有的值至少包含一个无法转换的值。选择 try_cast(GlobalID as uniqueidentifier) 为 null 的行以查找不可转换的值。然后决定如何进行。
  • 这应该是答案,而不仅仅是评论
  • 谢谢@DRich。你是对的,我有一个不可兑换的价值。还了解了非常方便的 try_cast。谢谢你们!
  • + @SMor 以及

标签: sql sql-server uniqueidentifier sqldatatypes nvarchar


【解决方案1】:

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

Select GlobalID from RPT.table1 WHERE GlobalID NOT LIKE '________-____-____-____-____________'

(那些下划线混淆在一起,所以为了明确起见:8个下划线,破折号,4个下划线,破折号,4个下划线,破折号,4个下划线,破折号,12个下划线)

也许检查一下

Select GlobalID from RPT.table1 WHERE GlobalID IS NULL

【讨论】:

  • 这只会找到字符模式有效的值。仍然有很多值不是匹配此模式的有效唯一标识符。
  • 这只是一个起点。我认为@SMor 的评论是一个更严格的解决方案。
猜你喜欢
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
  • 2018-04-06
  • 2012-10-18
  • 2013-04-07
  • 2011-12-11
相关资源
最近更新 更多