Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server MSSQL意外输出XML中的二进制字段_Sql Server_Xml_Tsql_Xslt_Mssql Jdbc - Fatal编程技术网

Sql server MSSQL意外输出XML中的二进制字段

Sql server MSSQL意外输出XML中的二进制字段,sql-server,xml,tsql,xslt,mssql-jdbc,Sql Server,Xml,Tsql,Xslt,Mssql Jdbc,我试图在XML文件中为我的XSLT项目获取一个二进制(16),以转换它 以下是我所尝试的: 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)

我试图在XML文件中为我的XSLT项目获取一个
二进制(16)
,以转换它

以下是我所尝试的:

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

无论我尝试过什么,我的
二进制ID
都从
0x00D25E18AEFF4979A244C2EB132791C1
更改为
ANJeGK7/SXmiRMLrEyeRwQ==

我使用JDBC连接器进行连接,并从数据库获取数据

我开始不知道我的问题是什么原因

我的项目可能吗?或者我必须将它与其他东西结合起来才能实现这一点吗

提前谢谢你的帮助

更新
这是我的XSLT脚本,它通过Java编译器连接到JDBC连接器

<?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>

挑选
AD.GGUID,
广告公司名称为Firmen_Name_1,
广告公司名称2作为公司名称2,
作为分支,
公元1年,作为土地,
公元1街,作为Straße,
AD.ZIP1作为PLZ,
从公元1年起,作为Ort,
公元前1年,作为邦德斯兰,
广告电话字段STR10作为电话号码,
AD.MAILFIELDSTR5作为电子邮件
从dbo.TABLE_I开始,作为CL
内部连接dbo.TABLE_II作为AD.GGUID=CL.TABLEGUID上的AD
其中CL.TABLENAME='地址'
和CL.FIELDNAME='复选框'
和AD.CHECKBOX=1
以及DATEADD(分钟,-60,SYSDATETIME())和SYSDATETIME()之间的AD.UPDATETIMESTAMP
按ad.GGUID DESC订购

我使用主函数varbintohextr自己修复了它

这是我完整的MSSQL语句

            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

提示:函数
varbintohexstring()
是有限的。。。我会在这里使用
CONVERT()

起初,十六进制字符串是在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>

ANJeGK7/SXmiRMLrEyeRwQ==
不是一个
varbinary
值,因此下面两个查询无法返回该值。这里的实际问题是什么?什么不起作用?样本数据和预期结果将帮助我们帮助您。我想您误解了我,因为我在数据库中得到了一个二进制ID,它是
0x00D25E18AEFF4979A244C2EB132791C1
,这就是我想要的。但我得到的是ANJeGK7/SXmiRMLrEyeRwQ==。我还尝试了
convert(binary(16)
cast(…作为binar(16))
太多,没有任何效果……如果
BinaryID
的值为
0x00D25E18AEFF4979A244C2EB132791C
选择BinaryID
将返回该值……至于
convert(binary(16),BinaryID)
is
binaryID
已经是一个
binary
值(我假设它是基于它的名称和缺少其他信息)然后,
转换
将不起任何作用。
二进制
不可能返回值
'ANJeGK7/SXmiRMLrEyeRwQ='
因为这不是一个
二进制
值,它是一个
(n)varchar
。在MSSQL Studio上,它不在我的JDBC项目中…这是我的问题,我也使用了不同的二进制ID,结果是相同的。向我们展示您的项目中的代码,SQL与此问题没有任何关系。所以情况很好,但我现在如何使用它动态?我现在尝试了很多方法,每次都出错。我没有ried希望获取GUID作为变量,然后将其转换,但它不能用于
@base64
示例。结果为空。@RyffLe,GGUID的实际数据类型是什么?它代表什么?@RyffLe,只是为了证明,您得到的结果(在您的问题中)尝试以下操作:
声明@YourBase64 VARCHAR(25)='ANJeGK7/SXmiRMLrEyeRwQ=';选择CAST(@YourBase64为XML)。value('.','binary(16)
。有多种方法可以在binary和base64之间进行转换…@Ryffle如果你的
GGUID
类型是
binary
实际上,使用
CONVERT(varchar(25),GGUID,1)就足够了
为了获得十六进制字符串…我在XSLT项目中尝试了它,结果与我的问题中的结果相同。但是
转换(varchar(25),GGUID,1)
似乎可以工作:)谢谢。
  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