वारकरी को वारकरी में बदलना


17

मैं अपनी क्वेरी योजनाओं के साथ-साथ, प्रदर्शन में रुझानों की निगरानी करने और उन क्षेत्रों की पहचान करने की अनुमति देने के लिए एक महंगी चल रही क्वेरी का एक लॉग रख रहा हूं, जिन्हें अनुकूलन की आवश्यकता है।

हालाँकि, यह उस बिंदु पर आ गया है जहाँ क्वेरी योजनाएँ बहुत अधिक स्थान ले रही हैं (जैसा कि हम प्रत्येक क्वेरी के विरुद्ध पूरी योजना बना रहे हैं)।

इसलिए मैं QueryPlanHash और QueryPlan को किसी अन्य तालिका से निकालकर मौजूदा डेटा को सामान्य करने का प्रयास कर रहा हूं।

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

की परिभाषा के रूप में query_plan_hashमें 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.

समस्या यह है कि क्वेरी प्लान हैश पहले से ही द्विआधारी प्रारूप में हैं, हालांकि एक्सएमएल क्वेरी प्लान जैसे VARCHAR के रूप में संग्रहीत हैं

0x9473FBCCBC01AFE

और बायनेरी को परिवर्तित एक पूरी तरह से अलग मूल्य देता है

0x3078393437334642434342433031414645

मैंने द्विआधारी चयन में मूल्य परिभाषा को बाइनरी में बदलने की कोशिश की, लेकिन फिर इसे कोई मान नहीं लौटाया।

मैं 0x9473FBCCBC01AFEएक VARBINARYके बजाय एक XML क्वेरी योजना से मूल्य कैसे निकालूंगा VARCHAR?

जवाबों:


28

आपको एक विशिष्ट शैली का उपयोग करने की आवश्यकता होती है जब आप एक स्ट्रिंग से परिवर्तित करते समय समान बाइनरी मान रखने की अपेक्षा करते हैं। अन्यथा SQL सर्वर स्ट्रिंग को उसी तरह से एनकोड करने की कोशिश करता है जिस तरह से वह एनकोड करेगा 'bob'या 'frank'

उस ने कहा, आपका इनपुट स्ट्रिंग सही नहीं है - या तो एक बाइट गायब है या एक बाइट बहुत अधिक है। यदि मैं अनुगामी छोड़ता हूं तो यह ठीक काम करता है E:

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

परिणाम द्विआधारी है:

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

1
आह, ,1मैं क्या याद कर रहा था। मैं उम्मीद कर रहा था की तुलना में आसान था! धन्यवाद!
मार्क सिंकिनसन

लापता / अतिरिक्त बाइट के बारे में निश्चित नहीं है। मेरे पास मौजूद 2666 अभिलेखों में, 183 है जो विफल हो जाते हैंTRY_CONVERT
मार्क सिंकिनसन

विषम चरित्र गणना के साथ किसी भी तार को एक चरित्र (जैसे, 0) को जोड़ने की आवश्यकता हो सकती है। यह मान बदलता है, लेकिन हमेशा उसी मूल्य को उसी तरह बदलना चाहिए (और मुझे संदेह नहीं है कि आपके पास 0 के साथ या उसके बिना कोई टक्कर होगी)।
हारून बर्ट्रेंड

क्या वह बग नहीं है? Xml में क्वेरीप्लान्श स्पष्ट रूप से उस मान पर सेट है ... निश्चित रूप से ए TRY_CONVERTको BINARYवापस नहीं लौटना चाहिएNULL
मार्क सिंकिनसन

मेरी तालिका में सहेजे गए मूल्यों को xml से तुलना करने से यह वास्तव में एक अग्रणी 0 है जो गायब है। तो मान 0x09473FBCCBC01AF होना चाहिए। मैं एक साधारण उत्तर के साथ उन लोगों को ठीक कर सकते हैं, लेकिन मुझे यकीन है कि यह एक बग है ...
मार्क Sinkinson 24/14

0

मैं एक XML संस्करण योजना से 0x9473FBCCBC01AFE का मान VARBARAR के बजाय VARBINARY के रूप में कैसे निकालूंगा?

मुझे ऐसा कुछ सामना करना पड़ा जिसमें CASD तालिकाओं पर HeidiSQL का उपयोग करके क्वेरी की गई, और fn_varbintohexstr () के साथ इस तरह हल किया गया :

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

HeidiSQL के साथ, मान '0x3F3F3F3F3F3F3F3F3F' की तरह गलत था और '0x158B1DB75616484695684007CE98E21C' की तरह सही हो गया।

OBS: MSSQL 2008 के बाद से काम करता है! आशा करता हूँ की ये काम करेगा!


2
fn_varbintohexstr() यहाँ उल्लिखित का उपयोग करने के लिए चेतावनी पर ध्यान दें ।
एरिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.