sql-server – 将VARCHAR转换为VARBINARY

前端之家收集整理的这篇文章主要介绍了sql-server – 将VARCHAR转换为VARBINARY前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在表格中记录了昂贵的运行查询及其查询计划,以便我们监控性能趋势并确定需要优化的区域.

但是,它已经到了查询计划占用太多空间的程度(因为我们正在针对每个查询存储整个计划).

因此,我试图通过将QueryPlanHash和QueryPlan提取到另一个表来规范化现有数据.

CREATE TABLE QueryPlans
(
    QueryPlanHash VARBINARY(25),QueryPlan XML,CONSTRAINT PK_QueryPlans PRIMARY KEY
    (
      QueryPlanHash
    )
);

由于sys.dm_exec_query_stats中query_plan_hash的定义是二进制字段(我经常插入新数据),我在新表中使用VARBINARY作为数据类型.

但是,下面的插入失败了……

INSERT INTO QueryPlans
    ( QueryPlanHash,QueryPlan )
SELECT queryplanhash,queryplan
FROM
(
    SELECT 
      p.value('(./@QueryPlanHash)[1]','varchar(20)') queryplanhash,QueryPlan,ROW_NUMBER() OVER (PARTITION BY p.value('(./@QueryPlanHash)[1]','varchar(20)') ORDER BY DateRecorded) rownum
    FROM table
    CROSS APPLY QueryPlan.nodes('/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple[@QueryPlanHash]') t(p)
) data
WHERE rownum = 1

….带错误

Implicit conversion from data type varchar to varbinary is not allowed. Use the CONVERT function to run this query.

问题是查询计划哈希值已经是二进制格式,但是在XML查询计划中存储为VARCHAR,例如

0x9473FBCCBC01AFE

和CONVERT到BINARY给出了完全不同的值

0x3078393437334642434342433031414645

我尝试将XQuery select中的值定义更改为二进制,但之后它没有返回任何值.

如何从XML查询计划中将0x9473FBCCBC01AFE的值作为VARBINARY而不是VARCHAR提取

解决方法

当您希望在从字符串转换时保持相同的二进制值时,您需要使用特定样式.否则,sql Server会尝试对字符串进行编码,方法与编码“bob”或“frank”的方式相同.

也就是说,您的输入字符串看起来不正确 – 缺少一个字节或一个字节太多.如果我删除尾随E,这可以正常工作:

SELECT CONVERT(VARBINARY(25),'0x9473FBCCBC01AF',1);
------------ the,1 is important ---------------^^^

结果是二进制的:

----------------
0x9473FBCCBC01AF

猜你在找的MsSQL相关文章