Sql server MSSQL意外输出XML中的二进制字段
我试图在XML文件中为我的XSLT项目获取一个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)
二进制(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)
isbinaryID
已经是一个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