AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 320855
Accepted
Joe Obbish
Joe Obbish
Asked: 2022-12-13 08:32:24 +0800 CST2022-12-13 08:32:24 +0800 CST 2022-12-13 08:32:24 +0800 CST

为什么在尝试将 VARCHAR 转换为 UNIQUEIDENTIFIER 时 TRY_CAST 会抛出错误?

  • 772

我在一个表中有一个 VARCHAR(MAX) 列,它可以以多种不同的格式存储数据,包括 GUID 格式。在另一个表中加入 UNIQUEIDENTIFIER 列时,我尝试了以下代码:

TRY_CAST(b.val AS uniqueidentifier) = a.guid_col

我收到以下错误:

消息 8152,级别 16,状态 10,第 73 行

字符串或二进制数据将被截断。

TRY_CAST的文档确实说在某些情况下会抛出错误:

但是,如果您请求明确不允许的转换,则 TRY_CAST 会失败并出现错误。

但是,SQL Server 允许从 VARCHAR 到 UNIQUEIDENTIFIER 的转换:

在此处输入图像描述

我能够找到一个引发错误的示例值。该值很长,所以我在其中包含了一个fiddle。有用的评论者提供了一个更简单的问题重现:

DECLARE @s VARCHAR(MAX) = REPLICATE(CAST('A' AS VARCHAR(MAX)), 8001);

SELECT TRY_CAST(@s AS UNIQUEIDENTIFIER);

为什么在尝试将某些 VARCHAR 值转换为 UNIQUEIDENTIFIER 时 TRY_CAST 抛出错误而不是返回 NULL 值?

sql-server
  • 1 1 个回答
  • 456 Views

1 个回答

  • Voted
  1. Best Answer
    Paul White
    2022-12-13T17:11:45+08:002022-12-13T17:11:45+08:00

    文档中的转换表不区分varcharand varchar(max),尽管and文档的另一部分说:CASTCONVERT

    大值数据类型

    大值数据类型与其较小的对应数据类型具有相同的隐式和显式转换行为 - 特别是nvarchar、varbinary和varchar数据类型。但是,请考虑以下准则:

    • 从大值数据类型(如varchar(max) )转换为较小的对应数据类型(如varchar)是隐式转换,但如果大值的大小超过较小数据类型的指定长度,则会发生截断.

    同样相关,来自char 和 varchar:

    当字符表达式转换为不同大小的字符数据类型时,对于新数据类型来说太长的值将被截断。出于从字符表达式转换的目的, uniqueidentifier类型被视为字符类型,因此要遵守转换为字符类型的截断规则。

    当您向varchar(max)以非最大类型作为目标的TRY_*函数提供 a 时,会尝试将大值转换为非最大字符串。如果成功,一切都很好。如果不是,您会收到“字符串或二进制数据将被截断”。错误,因为最大字符串不适合。这与上面的文档背道而驰,该文档指出发生了截断。

    我自己的经验是,max数据类型有时确实有不遵循转换图表或详细文档的行为。

    此行为并非特定于,问题中的演示将因或uniqueidentifier等其他类型而失败。bigintdate

    我的回忆是,TRY_*对于兼容的类型sql_variant(不包括大型类型),它将可靠地工作。您还可以使用 try 函数在 max 类型之间进行转换,只是不总是从 max 到 non-max。

    从用户体验的角度来看,这并不理想。我不知道这是文档错误还是意外行为。

    作为解决方法,您可以在尝试转换之前将 LOB 文本转换为 GUID 的字符串表示形式的长度:

    DECLARE @s varchar(max) = REPLICATE(CONVERT(varchar(max), 'A'), 8001);
    
    -- No error
    SELECT TRY_CONVERT(uniqueidentifier, CONVERT(char(36), @s));
    

    现有Microsoft 反馈项。

    相关问答:

    • 在计算字段上创建索引:字符串或二进制数据将被截断
    • 字符串或二进制数据将被截断:错误未被 TRY_CAST 捕获
    • 9

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve