Sql-Server
將 VARCHAR 轉換為 VARBINARY
我一直在一個表中記錄昂貴的執行查詢及其查詢計劃,以便我們監控性能趨勢並確定需要優化的區域。
但是,查詢計劃佔用了太多空間(因為我們要針對每個查詢儲存整個計劃)。
因此,我試圖通過將 QueryPlanHash 和 QueryPlan 提取到另一個表來規範化現有數據。
CREATE TABLE QueryPlans ( QueryPlanHash VARBINARY(25), QueryPlan XML, CONSTRAINT PK_QueryPlans PRIMARY KEY ( QueryPlanHash ) );
由於
query_plan_hash
in的定義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
而不是 aVARCHAR
?
當您希望在從字元串轉換時保持相同的二進制值時,您需要使用特定的樣式。否則,SQL Server 會嘗試以與編碼
'bob'
或相同的方式對字元串進行編碼'frank'
。也就是說,您的輸入字元串看起來不正確 - 缺少一個字節或一個字節太多。如果我放棄尾隨,這很好用
E
:SELECT CONVERT(VARBINARY(25), '0x9473FBCCBC01AF', 1); ------------ the ,1 is important ---------------^^^
結果是二進制的:
---------------- 0x9473FBCCBC01AF