ডায়নামিক এসকিউএল (পিভট ক্যোয়ারী) কে এক্সএমএল আউটপুটে রূপান্তর করার সময় কেন তারিখের প্রথম অঙ্কটি ইউনিকোডে রূপান্তরিত হয়?


11

আমি পাইভট তৈরি করতে এবং এটি এক্সএমএল ডেটাতে রূপান্তর করতে ব্লুফিট থেকে /dba//a/25818/113298 এই দুর্দান্ত উদাহরণটি ব্যবহার করছি ।

পরম ঘোষণা করছেন

DECLARE @cols AS NVARCHAR(MAX),  @query  AS NVARCHAR(MAX);

এরপরে অনেকগুলি কোড সহ একটি সিটিই রয়েছে, সিটিইর শেষ ফলাফলটি একটি অস্থায়ী ডিবিতে রাখা হয় (উদাহরণের মতো)

SELECT 
B.[StayDate] -- this is a date dd-mm-yyyy
, B.[Guid]
INTO #tempDates
FROM BaseSelection B

কলস তৈরি করা হচ্ছে (উদাহরণের মতো)

SELECT @cols = STUFF((SELECT distinct ',' +QUOTENAME(convert(char(10), [StayDate] , 120)) 
FROM #tempDates
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)') 
,1,1,'');

ফলাফল সেটটি আমার প্রত্যাশা করা উচিত

set @query = 
   'SELECT [Guid],' + @cols +'
    FROM
    (
        SELECT 
            [StayDate] 
           ,[Guid]
        FROM #tempDates
    ) A
    pivot
    (
        count([StayDate])
        for [StayDate] in (' + @cols +')                    
    ) p
    '
EXEC sp_executesql  @query ;

এখানে চিত্র বর্ণনা লিখুন

আমি যখন এটি এক্সএমএলে রূপান্তর করার চেষ্টা করি তখন আমার বৈশিষ্ট্যগুলি কেবল আংশিক রূপান্তরিত হয়

set @query = 
   'SELECT [Guid],' + @cols +'
    FROM
    (
        SELECT 
            [StayDate] 
           ,[Guid]
        FROM #tempDates
    ) A
    pivot
    (
        count([StayDate])
        for [StayDate] in (' + @cols +')                    
    ) p
    for xml auto
    -- when using for XML path i will get a error
    -- FOR XML PATH(''''), ROOT(''root'') 
    -- Msg 6850, Level 16, State 1, Line 3
    -- Column name '2016-12-17' contains an invalid XML identifier 
    -- as required by FOR XML; '2'(0x0032) is the first character at fault.
    '
EXEC sp_executesql  @query ;

ফলাফল সেট

<p Guid="3C3359E3-CFE5-E511-80CA-005056A90901"
  _x0032_016-12-17="2" --> should be 2016-12-17="2" 
  _x0032_016-12-18="2" --> should be 2016-12-18="2" 
  _x0032_016-12-19="2" --> should be 2016-12-19="2" 
/>

আমি কি কিছু মিস করেছি, কেন কেবল তারিখের একটি অংশ ইউনিকোডে রূপান্তরিত হয়?

আমি এটা কিভাবে ঠিক করবো?


এটি এসকিউএল সার্ভারের কোন সংস্করণের জন্য?
ypercubeᵀᴹ

SQL সার্ভার 2012, তবে এটি বিন্দু নয়, এটি এক্সএমএলগুলির চশমা যা এই ক্ষেত্রে গুরুত্বপূর্ণ
Bunkerbuster

এটি একটি এক্সওয়াই-সমস্যার মতো মনে হচ্ছে। এক্সএমএলে একটি অ্যাট্রিবিউট নাম হিসাবে একটি তারিখ ব্যবহার করা অসুস্থ বলে মনে হচ্ছে যদিও এটি উদ্দেশ্য হিসাবে কাজ করেছে। আমি তারিখটি কোনও গুনের মান হিসাবে বা সম্ভবত কোনও উপাদানটির পাঠ্য হিসাবে সঞ্চয় করতে চাইছি, তার উপর নির্ভর করে আমি এটি কী পরিকল্পনা করেছি। প্রয়োজনে, আমি জোড়া গুণাবলী দিয়ে একাধিক উপাদান তৈরি করব।
jpmc26

উত্তর:


14

এক্সএমএলে বৈশিষ্ট্যযুক্ত নামগুলিকে একটি সংখ্যা দিয়ে শুরু করার অনুমতি দেওয়া হয় না, নেমস্টার্টচার দেখুন

আপনাকে নিজের বৈশিষ্ট্যের জন্য বিকল্প নাম নিয়ে আসতে হবে এবং @colsআপনার গতিশীল পিভট ক্যোয়ারির জন্য আলাদা আলাদা ভেরিয়েবল নির্দিষ্ট কলামের উপকরণ নির্দিষ্ট করে এনকোড করতে হবে ।

SELECT @cols2 = STUFF((SELECT distinct ',' +
                       quotename(convert(char(10), [StayDate] , 120)) + 
                       ' as '+ QUOTENAME('z'+convert(char(10), [StayDate] , 120)) 
FROM #tempDates
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)') 
,1,1,'');

ফলাফল;

[2016-12-20] as [z2016-12-20],[2016-12-21] as [z2016-12-21]
<p Guid="6365FC57-F476-4703-B9D4-1EB81288FF30" z2016-12-20="0" z2016-12-21="1" />
<p Guid="B38FA9DB-B4E1-4725-8F3B-3AF6E009C10A" z2016-12-20="1" z2016-12-21="0" />

আপনি for xml autoএসকিউএল সার্ভার ব্যবহার করার সময় এটি আপনার জন্য করে ।


এটি ছিল অনুপস্থিত লিঙ্ক, এক্সএমএল পাথ ('') এর জন্যও, রুট ('রুট') এখন কাজ করছে।
বুঙ্কারবাস্টার

6

প্রথম অক্ষরটি ইউনিকোড নয়, প্রতি সে। আমি বলতে চাইছি, প্রযুক্তিগতভাবে এসকিউএল সার্ভারের মধ্যে এক্সএমএলের সমস্ত অক্ষরগুলি ইউটিএফ -16 লিটল এন্ডিয়ান হিসাবে এনকোড করা হয়েছে, সুতরাং সেই অর্থে তারা সমস্ত ইউনিকোড। তবে, আপনি যা দেখছেন তা কেবল একটি চরিত্রের জন্য পালিয়ে যাওয়া স্বরলিপি, এই ক্ষেত্রে "2", যার "32" এর হেক্স / বাইনারি মান রয়েছে।

সমস্যাটি হ'ল এক্সএমএল নাম সংখ্যা দিয়ে শুরু করতে পারে না। নিম্নলিখিত পরীক্ষাগুলি দেখায় যে কোনও সংখ্যার সাথে শুরু হওয়া কোনও গুণবাচক নাম বা উপাদানটির নাম ত্রুটি পায় তবে আন্ডারস্কোর ( _) বা একটি অক্ষর দিয়ে শুরু করা ঠিক ঠিক।

SELECT CONVERT(XML, N'<test><row 2016-12-17="2" /></test>');
/*
Msg 9455, Level 16, State 1, Line 10
XML parsing: line 1, character 12, illegal qualified name character
*/


SELECT CONVERT(XML, N'<test><2016>a</2016></test>');
/*
Msg 9455, Level 16, State 1, Line 10
XML parsing: line 1, character 8, illegal qualified name character
*/


SELECT CONVERT(XML, N'<test><row _2016-12-17="2" /></test>');
/*
<test>
  <row _2016-12-17="2" />
</test>
*/


SELECT CONVERT(XML, N'<test><row x2016-12-17="2" /></test>');
/*
<test>
  <row x2016-12-17="2" />
</test>
*/

সুতরাং, আপনাকে XML বৈশিষ্ট্য বা উপাদান নামের জন্য প্রাথমিক অক্ষর হিসাবে বৈধ এমন একটি অক্ষরের সাথে কলামের নামগুলি উপস্থাপন করতে হবে।


এছাড়াও, আপনি কি নিশ্চিত যে এটি "কাজ" করছে FOR XML AUTO? আমি যা দেখতে পাচ্ছি তা থেকে এটি কেবল "অবৈধ" অক্ষরটিকে স্বয়ংক্রিয়ভাবে রূপান্তর করছে _x0032_:

SELECT tmp.* FROM (SELECT 2) tmp([2016]) FOR XML AUTO;

রিটার্নস:

<tmp _x0032_016="2" />
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.