【问题标题】:SQL Server 14.0: Convert a VARBINARY(MAX) to UInt16, UInt32, UInt64 or SByteSQL Server 14.0:将 VARBINARY(MAX) 转换为 UInt16、UInt32、UInt64 或 SByte
【发布时间】:2019-09-05 06:42:17
【问题描述】:

我想知道是否可以将 VARBINARY(MAX) 值转换回原始值。 原始值可以是任何受支持的 SQL 类型(文本、数字和浮点),也可以是 (.NET) 类型 UInt16Uint32UInt64SByte

SQL Server 不支持这些类型,因此

SELECT CAST([BinaryData] AS UINT) from [Data]
在这里不起作用,因为这些类型未知?

现在我正在我的 C# 程序中进行这种转换,但我认为如果可以在 SQL Server 端完成它会更好。这样我也可以在 SQL 服务器上而不是在 .NET 程序中进行更多的计算。

有什么建议或解决方案吗?

【问题讨论】:

  • 我认为你需要进一步解释你的问题的大局以获得有意义的建议。我的意思是,如果原始值不是 varbinary,为什么要存储为 varbinary 值?当你说原始值时,你怎么知道原始值的数据类型是什么?当然,您只能在 SQL Server 中转换为 SQL Server 支持的数据类型,因此您要么使用有效的 SQL Server 类型,要么在代码中进行。但在我看来,设计是错误的。
  • 您是否也将源类型与二进制数据一起存储?
  • @DaleBurrell 这是一个大数据记录应用程序。客户希望每个值(无论类型)都在同一列中,因此我们在代码中将每个值转换为 VARBINARY 并将它们插入数据库中(不能使用 REAL,因为插入了字符串)。
  • @SalmanA 类型与数据一起存储,所以我知道我必须做什么转换(在 C# 代码中)
  • 您已经知道您无法转换为 .net 类型...那么您在寻找什么答案?

标签: .net sql-server casting type-conversion


【解决方案1】:

您需要检查SQL Server Data Type Conversion Graph 在 SQL Server 中进行数据类型转换。

请检查SQL-CLR Numeric Type Mapping 即:CLR 类型 >> 默认 SQL Server 类型

对于 INT、BIGINT 数据类型的 max positive value。 (您可以在左侧窗格中更改 SQL Server 版本)

请查看以下脚本,了解从 VARBINARY(MAX) 到 UInt16 (INT)、UInt32 (BIGINT)、UInt64 (DECIMAL(20)) 的转换。

DECLARE 
    @a_INT INT,
    @a_BIGINT BIGINT,
    @a_decimal_20 DECIMAL(20),
    @bvarbin_INT VARBINARY(MAX),
    @bvarbin_BIGINT VARBINARY(MAX),
    @bvarbin_decimal_20 VARBINARY(MAX),
    @cresult_UInt16 INT,
    @cresult_UInt32 BIGINT,
    @cresult_UInt64 DECIMAL(20)

SELECT
    @a_INT = 2147483647,--INT MAX VALUE
    @a_BIGINT = 9223372036854775807, -- BIGINT MAX VALUE
    @a_decimal_20 = 99999999999999999999 -- DECIMAL(20) MAX VALUE

SELECT
    @bvarbin_INT = CONVERT(VARBINARY(MAX),@a_INT),
    @bvarbin_BIGINT = CONVERT(VARBINARY(MAX),@a_BIGINT),
    @bvarbin_decimal_20 = CONVERT(VARBINARY(MAX),@a_decimal_20)

SELECT
    @cresult_UInt16 = CONVERT(INT,@bvarbin_INT),
    @cresult_UInt32 = CONVERT(BIGINT,@bvarbin_BIGINT),
    @cresult_UInt64 = CONVERT(DECIMAL(20),@bvarbin_decimal_20)

SELECT 
    @a_INT a_INT,
    @a_BIGINT a_BIGINT,
    @a_decimal_20 a_decimal_20,
    @bvarbin_INT bvarbin_INT,
    @bvarbin_BIGINT bvarbin_BIGINT,
    @bvarbin_decimal_20 bvarbin_decimal_20,
    @cresult_UInt16 cresult_UInt16,
    @cresult_UInt32 cresult_UInt32,
    @cresult_UInt64 cresult_UInt64;

注意:小心 - 数据会改变

  1. 将 DECIMAL varbinary 值转换为 BIGINT 或 INT 时
  2. 将 BIGINT varbinary 值转换为 INT 时

【讨论】:

  • 这仅适用于支持的 SQL 类型。我正在寻找一种将 VARBINARY 转换为 UInt32 等不受支持的类型的方法。
  • @lordvlad30 SQL Server 中没有 UInt32。 UInt32 是一种 .NET 类型。在 SQL Server 中,您只需使用足够大的数字类型,例如bigint 或大的decimal。吉肯的回答是正确的。问题在于问题本身及其背后的假设。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 2010-09-08
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多