Mar*_*son 19 xml sql-server varchar sql-server-2012 varbinary
我一直在一个表中记录昂贵的运行查询及其查询计划,以便我们监控性能趋势并确定需要优化的区域。
然而,现在已经到了查询计划占用太多空间的地步(因为我们针对每个查询存储整个计划)。
因此,我试图通过将 QueryPlanHash 和 QueryPlan 提取到另一个表来规范化现有数据。
CREATE TABLE QueryPlans
(
QueryPlanHash VARBINARY(25),
QueryPlan XML,
CONSTRAINT PK_QueryPlans PRIMARY KEY
(
QueryPlanHash
)
);
Run Code Online (Sandbox Code Playgroud)
由于query_plan_hashin的定义sys.dm_exec_query_stats是一个二进制字段(并且我会定期插入新数据),因此我使用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
Run Code Online (Sandbox Code Playgroud)
....有错误
Implicit conversion from data type varchar to varbinary is not allowed. Use the CONVERT function to run this query.
Run Code Online (Sandbox Code Playgroud)
问题是查询计划哈希已经是二进制格式,但是在 XML 查询计划中存储为 VARCHAR,例如
0x9473FBCCBC01AFE
Run Code Online (Sandbox Code Playgroud)
和 CONVERT to BINARY 给出一个完全不同的值
0x3078393437334642434342433031414645
Run Code Online (Sandbox Code Playgroud)
我尝试将 XQuery 选择中的值定义更改为二进制,但它没有返回任何值。
我如何0x9473FBCCBC01AFE从 XML 查询计划中提取 的值作为VARBINARY,而不是VARCHAR?
Aar*_*and 32
当您希望在从字符串转换时保持相同的二进制值时,您需要使用特定的样式。否则,SQL Server 会尝试以与编码'bob'或相同的方式对字符串进行编码'frank'。
也就是说,您的输入字符串看起来不正确 - 缺少一个字节或一个字节太多。如果我删除尾随,这很好用E:
SELECT CONVERT(VARBINARY(25), '0x9473FBCCBC01AF', 1);
------------ the ,1 is important ---------------^^^
Run Code Online (Sandbox Code Playgroud)
结果是二进制的:
----------------
0x9473FBCCBC01AF
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
171505 次 |
| 最近记录: |