কোনও ভ্রচারকে ভার্বিনারিতে রূপান্তর করা


17

আমাদের কার্য সম্পাদনের প্রবণতাগুলি নিরীক্ষণ করার জন্য এবং অনুকূলিতকরণের প্রয়োজনীয় ক্ষেত্রগুলি সনাক্ত করতে একটি টেবিলে আমি ব্যয়বহুল চলমান অনুসন্ধানগুলির একটি লগ রাখছি।

তবে, এটি এমন পর্যায়ে এসে গেছে যেখানে ক্যোয়ারী পরিকল্পনাগুলি খুব বেশি জায়গা নিচ্ছে (যেমন আমরা প্রতিটি প্রশ্নের বিপরীতে পুরো পরিকল্পনাটি সংরক্ষণ করি) oring

আমি কোয়েরিপ্ল্যানহ্যাশ এবং কোয়েরিপ্ল্যানটি অন্য টেবিলে সরিয়ে দিয়ে বিদ্যমান ডেটাগুলিকে সাধারণ করার চেষ্টা করছি।

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.

সমস্যাটি হ'ল ক্যোয়ারী প্ল্যান হ্যাশগুলি ইতিমধ্যে বাইনারি ফর্ম্যাটে রয়েছে, তবে এক্সএমএল ক্যোয়ারী প্ল্যানে যেমন ভোরচার হিসাবে সংরক্ষণ করা হয়েছে যেমন eg

0x9473FBCCBC01AFE

এবং কনভার্ট থেকে বিনারি একটি সম্পূর্ণ আলাদা মান দেয়

0x3078393437334642434342433031414645

আমি এক্সকিউয়েরিতে মান সংজ্ঞাটি বাইনারিতে নির্বাচন করার চেষ্টা করেছি, কিন্তু তারপরে এটি কোনও মান দেয় নি no

আমি কীভাবে এক্স এর চেয়ে 0x9473FBCCBC01AFEএক্সএমএল ক্যোয়ারী পরিকল্পনা থেকে এর মানটি বের করব ?VARBINARYVARCHAR

উত্তর:


28

আপনি যখন স্ট্রিং থেকে রূপান্তর করার সময় একই বাইনারি মান রাখার প্রত্যাশা করেন তখন আপনাকে একটি নির্দিষ্ট স্টাইল ব্যবহার করতে হবে। তা না হলে এসকিউএল সার্ভার স্ট্রিং একই ভাবে এটি সঙ্কেতাক্ষরে লিখা চাই এনকোড করার চেষ্টা করে 'bob'বা 'frank'

এটি বলেছিল, আপনার ইনপুট স্ট্রিংটি সঠিক দেখাচ্ছে না - হয় বাইট অনুপস্থিত বা একটি বাইট অনেক বেশি। আমি পিছনে ফেলে দিলে এটি ঠিকঠাক কাজ করে E:

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

ফলাফল বাইনারি:

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

1
আহ্, ,1আমি যা মিস করছিলাম। আমার প্রত্যাশার চেয়ে এটাই সহজ ছিল! ধন্যবাদ!
মার্ক সিংকিনসন

নিখোঁজ / অতিরিক্ত বাইট সম্পর্কে নিশ্চিত নয়। আমার কাছে থাকা 2666 রেকর্ডগুলিতে 183 রয়েছে যা ব্যর্থ হয়েছেTRY_CONVERT
মার্ক সিনকিনসন

বিজোড় অক্ষর গণনা সহ যে কোনও স্ট্রিংয়ে একটি অক্ষর (বলুন, 0) যুক্ত করতে পারে। এটি মান পরিবর্তন করে তবে সর্বদা একই মান একইভাবে পরিবর্তন করা উচিত (এবং আমি সন্দেহ করি না যে 0 এর সাথে বা ছাড়া আপনার কোনও সংঘর্ষ হবে)।
হারুন বারট্রান্ড

এটি কি বাগ নয়? XML- এর queryplanhash স্পষ্টভাবে কোনো মানে সেট করা ... নিশ্চয় একজন TRY_CONVERTএকটি থেকে BINARYফিরে আসতে করা উচিত নয়NULL
মার্ক Sinkinson

আমার টেবিলে সংরক্ষিত মানগুলিকে xML এর সাথে তুলনা করা থেকে এটি আসলে একটি শীর্ষস্থানীয় 0 যা অনুপস্থিত। সুতরাং মান 0x09473FBCCBC01AF হওয়া উচিত। আমি সাধারণ
রিপ্লেস দিয়ে এগুলি

0

আমি কোনও এক্সআরএমএল ক্যোয়ারী প্ল্যান থেকে ভার্চিনারির পরিবর্তে 0x9473FBCCBC01AFE এর মান কীভাবে বের করব?

আমি হ্যাসিএসকিউএল ব্যবহার করে CASD টেবিলগুলিতে ক্যোয়ারী তৈরি করার মতো কিছু মুখোমুখি হয়েছি এবং fn_varbintohexstr () দিয়ে এর সমাধান করেছি :

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

হেইডিএসকিউএল দিয়ে, মানটি '0x3F3F3F3F3F3F3F3F' এর মতো ভুল ছিল এবং '0x158B1DB75616484695684007CE98E21C' এর মতো সঠিক হয়ে উঠেছে।

ওবিএস: এমএসএসকিউএল ২০০৮ সাল থেকে কাজ করে! আশা করি এটা সাহায্য করবে!


2
fn_varbintohexstr() এখানে উল্লিখিত ব্যবহারের জন্য সতর্কতাগুলি নোট করুন
এরিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.