Sql-Server

將 VARCHAR 轉換為 VARBINARY

  • August 18, 2015

我一直在一個表中記錄昂貴的執行查詢及其查詢計劃,以便我們監控性能趨勢並確定需要優化的區域。

但是,查詢計劃佔用了太多空間(因為我們要針對每個查詢儲存整個計劃)。

因此,我試圖通過將 QueryPlanHash 和 QueryPlan 提取到另一個表來規範化現有數據。

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

由於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

….錯誤

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

問題是查詢計劃雜湊已經是二進制格式,但是在 XML 查詢計劃中儲存為 VARCHAR,例如

0x9473FBCCBC01AFE

並且 CONVERT to BINARY 給出完全不同的值

0x3078393437334642434342433031414645

我嘗試將 XQuery 選擇中的值定義更改為二進制,但隨後它沒有返回任何值。

如何0x9473FBCCBC01AFE從 XML 查詢計劃中提取 的值作為 aVARBINARY而不是 a VARCHAR

當您希望在從字元串轉換時保持相同的二進制值時,您需要使用特定的樣式。否則,SQL Server 會嘗試以與編碼'bob'或相同的方式對字元串進行編碼'frank'

也就是說,您的輸入字元串看起來不正確 - 缺少一個字節或一個字節太多。如果我放棄尾隨,這很好用E

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

結果是二進制的:

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

引用自:https://dba.stackexchange.com/questions/63743