加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – 将VARCHAR转换为VARBINARY

发布时间:2021-03-05 19:27:58 所属栏目:MsSql教程 来源:网络整理
导读:我在表格中记录了昂贵的运行查询及其查询计划,以便我们监控性能趋势并确定需要优化的区域. 但是,它已经到了查询计划占用太多空间的程度(因为我们正在针对每个查询存储整个计划). 因此,我试图通过将QueryPlanHash和QueryPlan提取到另一个表来规范化现有数据. C

我在表格中记录了昂贵的运行查询及其查询计划,以便我们监控性能趋势并确定需要优化的区域.

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

因此,我试图通过将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

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读