MS SQL Неожиданный вывод двоичного поля в XML - PullRequest
0 голосов
/ 19 июня 2020

Я попытался получить binary(16) для моего проекта XSLT в XML файле, чтобы преобразовать его.

Вот, что я пробовал:

SELECT BINARY_ID FROM dbo.MyTable

SELECT CONVERT(varbinary(16), BINARY_ID) AS BINARY_ID  FROM dbo.MyTable

SELECT CAST(BINARY_ID AS varbinary(20)) AS BINARY_ID FROM dbo.MyTable

SELECT CONVERT(BINARY(16), BINARY_ID) AS BINARY_ID  FROM dbo.MyTable

SELECT CAST(BINARY_ID AS binary(20)) AS BINARY_ID FROM dbo.MyTable

Что бы я ни делал попробовал, мой BINARY_ID изменился с 0x00D25E18AEFF4979A244C2EB132791C1 на ANJeGK7/SXmiRMLrEyeRwQ==

Я использую JDB C Connector для подключения и получения данных из базы данных.

I ' m уже не знаю, в чем причина моей проблемы.

Возможен ли вообще мой проект или мне нужно объединить его с чем-то еще, чтобы достичь этого?

Заранее спасибо за помощь .

ОБНОВЛЕНИЕ


Вот мой сценарий XSLT, который работает через компилятор Java в JDB C Connector
<?xml version="1.0" encoding="UTF-8"?>
  <xsl:output media-type="text/xml" method="xml"></xsl:output>
  <xsl:template match="/">
    <root>
      <statement format="yyyy-MM-dd' 'hh:mm" resulttag="object_II" timezone="UTC">
        <sql>
            SELECT
                AD.GGUID,
                AD.COMPNAME AS Firmen_Name_1,
                AD.COMPNAME2 AS Firmen_Name_2,
                AD.GWBRANCH AS Branche,
                AD.COUNTRY1 AS Land,
                AD.STREET1 AS Straße,
                AD.ZIP1 AS PLZ,
                AD.TOWN1 AS Ort,
                AD.GWSTATE1 AS Bundesland,
                AD.PHONEFIELDSTR10 AS Telefon_Nr,
                AD.MAILFIELDSTR5 AS EMail
            FROM dbo.TABLE_I AS CL
            inner join dbo.TABLE_II AS AD ON AD.GGUID = CL.TABLEGUID
                Where CL.TABLENAME = 'ADDRESS'
                    AND CL.FIELDNAME = 'CHECKBOX'
                    AND AD.CHECKBOX= 1
                    AND AD.UPDATETIMESTAMP BETWEEN DATEADD(MINUTE, -60, SYSDATETIME()) AND SYSDATETIME()
            Order BY ad.GGUID DESC
        </sql>
    </statement>
    </root>
  </xsl:template>
</xsl:stylesheet>

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Подсказка: функция varbintohexstring() ограничена ... Я бы использовал здесь CONVERT().

В начале HEX-строка была форматом по умолчанию для встраивания двоичных файлов в XML. В v2005 это было изменено на Base64, так как оно может представлять двоичное значение с меньшим количеством символов.

Попробуйте следующее:

DECLARE @someGuid UNIQUEIDENTIFIER = NEWID();

SELECT @someGuid AS TheGuid
      ,CAST(@someGuid AS BINARY(16)) binValue_Base64
      ,CONVERT(VARCHAR(25),CAST(@someGuid AS BINARY(16)),1) binValue_HexString
FOR XML PATH('test');

Результат

<test>
  <TheGuid>67D4B263-CEDC-4164-AA32-B7F8F6DCA946</TheGuid>
  <binValue_Base64>Y7LUZ9zOZEGqMrf49typRg==</binValue_Base64>
  <binValue_HexString>0x63B2D467DCCE6441AA32B7</binValue_HexString>
</test>

Идея в вкратце:

  • Кажется, вы говорите о GUID, но для любого другого значения справедливо следующее.
  • GUID - это очень особый тип значения, так как это двоичный но использует свой особый формат для представления.
  • Внутри XML, который является текстовым контейнером, любое значение должно быть представлено печатными символами (ну, здесь не говорится об объектах. ..)
  • Преобразование GUID в BINARY (16) приведет к значению в кодировке Base64 в XML.
  • Но вы можете использовать CONVERT() для преобразования BINARY в VARCHAR, что приведет к HEX-строке Прочтите раздел двоичные стили для подробностей )

Оба строка значения могут быть повторно преобразованы в исходный GUID (67D4B263-CEDC-4164-AA32-B7F8F6DCA946):

  DECLARE @base64 VARCHAR(25)='Y7LUZ9zOZEGqMrf49typRg==';

  SELECT CAST(@base64 AS xml).value('.','binary(16)') Base64_as_binary
        ,CAST(CAST(@base64 AS xml).value('.','binary(16)') AS UNIQUEIDENTIFIER) TheOriginalGuid

  DECLARE @HexString VARCHAR(25)='0x63B2D467DCCE6441AA32B7';

  SELECT CONVERT(BINARY(16),@HexString,1) Hex_as_binary
        ,CAST(CONVERT(BINARY(16),@HexString,1) AS UNIQUEIDENTIFIER) TheOriginalGuid
0 голосов
/ 19 июня 2020

Я исправил это самостоятельно, используя главную функцию varbintohexstr

Вот мой полный оператор MS SQL.

            SELECT
                UPPER(master.sys.fn_varbintohexstr(AD.GGUID)) AS GGUID,
            FROM dbo.TABLE_I AS CL
            inner join dbo.TABLE_II AS AD ON AD.GGUID = CL.TABLEGUID
                Where CL.TABLENAME = 'ADDRESS'
                    AND CL.FIELDNAME = 'Checkbox'
                    AND AD.Checkbox = 1
                    AND AD.UPDATETIMESTAMP BETWEEN DATEADD(MINUTE, -960, SYSDATETIME()) AND SYSDATETIME()
            Order BY ad.GGUID DESC

РЕЗУЛЬТАТ:

0X00D25E18AEFF4979A244C2EB132791C1
...