Преобразование шестнадцатеричных строк в Int64 в SQL: удобное руководство с примерами кода

Шестнадцатеричные строки обычно используются для представления двоичных данных, таких как уникальные идентификаторы или криптографические хеши. Однако существуют сценарии, в которых вам может потребоваться преобразовать эти шестнадцатеричные строки в тип данных INT64 в SQL. В этой статье мы рассмотрим различные методы достижения такого преобразования, дополненные примерами кода, которые позволят вам легко обрабатывать шестнадцатеричные строки и значения INT64 в ваших SQL-запросах.

Методы преобразования шестнадцатеричных строк в INT64:

Метод 1: использование функций CAST или CONVERT
Один простой подход — использовать встроенные функции CAST или CONVERT в SQL. Эти функции позволяют конвертировать данные из одного типа данных в другой. Чтобы преобразовать шестнадцатеричную строку в INT64, вы можете использовать следующий код:

DECLARE @hexString VARCHAR(16) = 'ABCD1234EF5678AB';
DECLARE @int64Value BIGINT;
SET @int64Value = CAST(CONVERT(VARBINARY(8), @hexString, 1) AS BIGINT);
SELECT @int64Value AS ConvertedValue;

Метод 2: использование функции PARSENAME
Другой метод предполагает использование функции PARSENAME, обычно используемой для анализа имен объектов, разделенных точкой. Однако его также можно использовать для преобразования шестнадцатеричной строки в INT64, рассматривая каждую пару шестнадцатеричных цифр как отдельную часть. Вот пример:

DECLARE @hexString VARCHAR(16) = 'ABCD1234EF5678AB';
DECLARE @int64Value BIGINT;
SET @int64Value = CAST(PARSENAME(REPLACE(@hexString, '', '.'), 1) AS BIGINT);
SELECT @int64Value AS ConvertedValue;

Метод 3: использование функций STRING_SPLIT и STRING_AGG (SQL Server 2016+)
Если вы используете SQL Server 2016 или более позднюю версию, вы можете использовать функции STRING_SPLIT и STRING_AGG вместе, чтобы разделить шестнадцатеричную строку на отдельные цифры и преобразовать их. в INT64, а затем агрегировать их обратно. Вот пример:

DECLARE @hexString VARCHAR(16) = 'ABCD1234EF5678AB';
DECLARE @int64Value BIGINT;
SET @int64Value = CAST(
    (SELECT STRING_AGG(CAST(CONVERT(BIGINT, value, 16) AS VARCHAR(2)), '')
     FROM STRING_SPLIT(@hexString, '')) AS BIGINT);
SELECT @int64Value AS ConvertedValue;

Метод 4: использование интеграции CLR
Если вы включили интеграцию CLR в SQL Server, вы можете создать специальную функцию SQL CLR для выполнения преобразования. Этот метод обеспечивает гибкость и производительность, но требует глубоких знаний интеграции CLR. Вот пример высокого уровня:

-- C# Code
using System;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public class HexToBigInt
{
    [SqlFunction(DataAccess = DataAccessKind.None)]
    public static SqlInt64 ConvertHexToBigInt(SqlString hexString)
    {
        if (hexString.IsNull)
            return SqlInt64.Null;
        string hex = hexString.Value.Replace("0x", "");
        long result = Convert.ToInt64(hex, 16);
        return new SqlInt64(result);
    }
}
-- SQL Code
CREATE ASSEMBLY HexToBigIntAssembly
FROM 'C:\Path\To\HexToBigInt.dll'
WITH PERMISSION_SET = SAFE;
CREATE FUNCTION ConvertHexToBigInt(@hexString NVARCHAR(MAX))
RETURNS BIGINT
AS EXTERNAL NAME HexToBigIntAssembly.HexToBigInt.ConvertHexToBigInt;
-- Usage
DECLARE @hexString VARCHAR(16) = 'ABCD1234EF5678AB';
DECLARE @int64Value BIGINT;
SET @int64Value = dbo.ConvertHexToBigInt(@hexString);
SELECT @int64Value AS ConvertedValue;

В этой статье мы рассмотрели несколько методов преобразования шестнадцатеричных строк в INT64 в SQL. Предпочитаете ли вы использовать встроенные функции, манипулирование строками или интеграцию CLR, теперь в вашем распоряжении множество методов. Понимая эти методы, вы сможете эффективно обрабатывать шестнадцатеричные строки и легко преобразовывать их в тип данных INT64, что позволит вам эффективно работать с двоичными данными в ваших SQL-запросах.