হালনাগাদ:
আমি মাইকেলের সূক্ষ্ম উত্তরের বিষয়ে একটি মন্তব্যে বলেছি, সর্বশেষ প্রয়োজনটি প্রতিফলিত করার জন্য আমি নীচের উদাহরণের ক্যোয়ারীতে কোড এবং সেইসাথে ইনপুট এবং আউটপুট এক্সএমএল আপডেট করেছি , যা হ'ল:
@ ভ্যালু খালি থাকলে বা বিদ্যমান না থাকলে মান উপাদান তৈরি করতে নয়
যদিও একটি একক অভিব্যক্তি সঠিকভাবে এই নতুন প্রকরণটির সাথে মেলে তবে খালিটি বাদ দেওয়ার কোনও উপায় বলে মনে হচ্ছে না <Value/>
একক পাসে উপাদানটি হচ্ছে না কারণ প্রতিস্থাপনের স্ট্রিংয়ে শর্তাধীন যুক্তি অনুমোদিত নয়। সুতরাং, আমি এটি একটি 2 অংশ সংশোধন হিসাবে মানিয়ে নিয়েছি: খালি খালি @Value
বৈশিষ্ট্য পেতে একটি পাস এবং খালি বৈশিষ্ট্য পেতে একটি পাস @Value
। বৈশিষ্ট্যটি <Element>
অনুপস্থিত হ্যান্ডেল করার দরকার ছিল না @Value
কারণ <Value>
ইচ্ছেটি কোনওভাবেই উপাদানটি না পাওয়া।
একটি বিকল্প হ'ল এক্সএমএলকে একটি নিয়মিত স্ট্রিং হিসাবে বিবেচনা করা এবং কোনও প্যাটার্নের ভিত্তিতে এটিকে রূপান্তর করা। এটি সহজেই নিয়মিত এক্সপ্রেশন (বিশেষত "প্রতিস্থাপন" ফাংশন) ব্যবহার করে সম্পন্ন হয় যা এসকিউএলসিআর কোডের মাধ্যমে উপলব্ধ করা যায়।
নীচের উদাহরণটি ব্যবহার করে এসকিউএল # লাইব্রেরি থেকে RegEx_Replace স্কেলার ইউডিএফ (যার লেখক আমি, তবে এই RegEx ফাংশনটি ফ্রি সংস্করণে উপলব্ধ, আরও অনেকগুলি সহ):
DECLARE @SomeXml XML;
SET @SomeXml = N'<Root attr1="val1" attr2="val2">
<Elements>
<Element Code="1" Value="aaa" ExtraData="extra1" />
<Element Code="22" Value="bbb" ExtraData="extra2" />
<Element Code="333" Value="ccc" ExtraData="extra3" />
<Element Code="4444" Value="" ExtraData="extra4" />
<Element Code="55555" ExtraData="extra5" />
</Elements>
<ExtraData>
<Something Val="1">qwerty A</Something>
<Something Val="2">qwerty B</Something>
</ExtraData>
</Root>';
DECLARE @TempStringOfXml NVARCHAR(MAX),
@Expression NVARCHAR(4000),
@Replacement NVARCHAR(4000);
SET @TempStringOfXml = CONVERT(NVARCHAR(MAX), @SomeXml);
PRINT N'Original: ' + @TempStringOfXml;
---
SET @Expression =
N'(<Element Code="[^"]+")\s+Value="([^"]+)"\s+(ExtraData="[^"]+")\s*/>';
SET @Replacement = N'$1 $3><Value>$2</Value></Element>';
SELECT @TempStringOfXml = SQL#.RegEx_Replace(@TempStringOfXml, @Expression,
@Replacement, -1, 1, '');
PRINT '-------------------------------------';
PRINT N'Phase 1: ' + @TempStringOfXml; -- transform Elements with a non-empty @Value
---
SET @Expression = N'(<Element Code="[^"]+")\s+Value=""\s+(ExtraData="[^"]+")\s*/>';
SET @Replacement = N'$1 $2 />';
SELECT @TempStringOfXml = SQL#.RegEx_Replace(@TempStringOfXml, @Expression,
@Replacement, -1, 1, '');
PRINT '-------------------------------------';
PRINT N'Phase 2: ' + @TempStringOfXml; -- transform Elements with an empty @Value
SELECT CONVERT(XML, @TempStringOfXml); -- prove that this is valid XML
PRINT
বিবৃতি সেখানে শুধু "বার্তা" ট্যাবে সহজ তুলনা সাইড-বাই-সাইড জন্য করতে হয়। ফলস্বরূপ আউটপুটটি হ'ল (খুব সহজেই স্পষ্ট করতে যে আমি কেবল কাঙ্ক্ষিত অংশগুলি স্পর্শ করেছি এবং অন্য কিছুই নয়) আমি মূল এক্সএমএলকে কিছুটা সংশোধন করেছি:
Original: <Root attr1="val1" attr2="val2"><Elements><Element Code="1" Value="aaa" ExtraData="extra1"/><Element Code="22" Value="bbb" ExtraData="extra2"/><Element Code="333" Value="ccc" ExtraData="extra3"/><Element Code="4444" Value="" ExtraData="extra4"/><Element Code="55555" ExtraData="extra5"/></Elements><ExtraData><Something Val="1">qwerty A</Something><Something Val="2">qwerty B</Something></ExtraData></Root>
-------------------------------------
Phase 1: <Root attr1="val1" attr2="val2"><Elements><Element Code="1" ExtraData="extra1"><Value>aaa</Value></Element><Element Code="22" ExtraData="extra2"><Value>bbb</Value></Element><Element Code="333" ExtraData="extra3"><Value>ccc</Value></Element><Element Code="4444" Value="" ExtraData="extra4"/><Element Code="55555" ExtraData="extra5"/></Elements><ExtraData><Something Val="1">qwerty A</Something><Something Val="2">qwerty B</Something></ExtraData></Root>
-------------------------------------
Phase 2: <Root attr1="val1" attr2="val2"><Elements><Element Code="1" ExtraData="extra1"><Value>aaa</Value></Element><Element Code="22" ExtraData="extra2"><Value>bbb</Value></Element><Element Code="333" ExtraData="extra3"><Value>ccc</Value></Element><Element Code="4444" ExtraData="extra4" /><Element Code="55555" ExtraData="extra5"/></Elements><ExtraData><Something Val="1">qwerty A</Something><Something Val="2">qwerty B</Something></ExtraData></Root>
আপনি যদি কোনও টেবিলের কোনও ক্ষেত্র আপডেট করতে চান তবে উপরেরটি নিম্নলিখিত হিসাবে মানিয়ে নিতে পারেন:
DECLARE @NonEmptyValueExpression NVARCHAR(4000),
@NonEmptyValueReplacement NVARCHAR(4000),
@EmptyValueExpression NVARCHAR(4000),
@EmptyValueReplacement NVARCHAR(4000);
SET @NonEmptyValueExpression =
N'(<Element Code="[^"]+")\s+Value="([^"]+)"\s+(ExtraData="[^"]+")\s*/>';
SET @NonEmptyValueReplacement = N'$1 $3><Value>$2</Value></Element>';
SET @EmptyValueExpression =
N'(<Element Code="[^"]+")\s+Value=""\s+(ExtraData="[^"]+")\s*/>';
SET @EmptyValueReplacement = N'$1 $2 />';
UPDATE tbl
SET XmlField = SQL#.RegEx_Replace4k(
SQL#.RegEx_Replace4k(
CONVERT(NVARCHAR(4000), tbl.XmlField),
@NonEmptyValueExpression,
@NonEmptyValueReplacement,
-1, 1, ''),
@EmptyValueExpression,
@EmptyValueReplacement,
-1, 1, '')
FROM SchemaName.TableName tbl
WHERE tbl.XmlField.exist('Root/Elements/Element/@Value') = 1;
<Value>
প্রতি একাধিক উপাদান থাকার পরিকল্পনা না করে আমি এর কোনও উপকারের কথা ভাবতে পারি না<Element>
। যদি তা না হয়, তবে একটি উপাদানের সাথে অ্যাট্রিবিউটটি সরিয়ে নেওয়া আরও প্রস্ফুটিত এবং সম্ভবত কম দক্ষ, এক্সএমএল তৈরি করে।