VARCHARからVARBINARYへの変換


17

パフォーマンスの傾向を監視し、最適化が必要な領域を特定できるように、実行中の高価なクエリのログとクエリプランをテーブルに保存しています。

ただし、クエリプランが多くのスペースを占有するようになります(各クエリに対してプラン全体を保存しているため)。

したがって、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 selectの値定義をバイナリに変更しようとしましたが、値が返されませんでした。

0x9473FBCCBC01AFEXMLクエリプランからの値をa VARBINARYではなくaとして抽出するにはどうすればよいVARCHARですか?

回答:


28

文字列から変換するときに同じバイナリ値を保持する場合は、特定のスタイルを使用する必要があります。それ以外の場合はSQL Serverは、文字列、それはエンコードするのと同じ方法でエンコードしようとし'bob'たりします'frank'

ただし、入力文字列が正しく表示されません-バイトが欠落しているか、1バイトが多すぎます。末尾を落とすとうまくいきますE

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

結果はバイナリです:

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

1
ああ、,1私が行方不明でした。それは思っていたより簡単でした!ありがとう!
マークシンキンソン

不足/余分なバイトについてはわかりません。私が持っている2666レコードには、失敗した183がありますTRY_CONVERT
マークシンキンソン14

文字数が奇数の文字列に文字(0など)を追加する必要がある場合があります。これは値を変更しますが、常に同じ方法で同じ値を変更する必要があります(そして、0の有無にかかわらず衝突が起こるとは思いません)。
アーロンバートランド

それはバグではありませんか?XMLでqueryplanhashが明示的にその値に設定されている...確かTRY_CONVERTにはBINARY返すべきではないNULL
マーク・Sinkinson

テーブルに保存されている値とxmlを比較すると、実際には先頭の0が欠落しています。したがって、値は0x09473FBCCBC01AFである必要があります。私はシンプルで、それらのアップがREPLACE修正することができますが、私は確信していることだバグ...
マーク・Sinkinson

0

XMLクエリプランから0x9473FBCCBC01AFEの値をVARCHARではなくVARBINARYとして抽出するにはどうすればよいですか?

私は、HeidiSQLを使用してCASDテーブルを照会するようなものに直面し、次のようにfn_varbintohexstr()で解決しました

SELECT master.dbo.fn_varbintohexstr(table.hexfield) FROM table;

HeidiSQLでは、値は「0x3F3F3F3F3F3F3F3F」のように間違っていて、「0x158B1DB75616484695684007CE98E21C」のように正しくなりました。

OBS:MSSQL 2008以降で動作します!それが役に立てば幸い!


2
fn_varbintohexstr() ここで言及した使用上の注意に注意してください
エリック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.