এক্সপ্যাথ / এক্সকিউয়ারি ব্যবহার করে একই এক্সএমএল উপাদানটির সমস্ত মানকে সংঘবদ্ধ করুন


14

আমার এর মতো একটি এক্সএমএল মান রয়েছে:

<R>
  <I>A</I>
  <I>B</I>
  <I>C</I>
  ...
</R>

আমি সব কনক্যাটেনেট করতে চান Iমান এবং তাদের একটি একক স্ট্রিং হিসেবে ফিরে ABC...

এখন আমি জানি যে আমি এক্সএমএল ছড়িয়ে দিতে পারি, ফলাফলগুলি নোডলেস এক্সএমএল হিসাবে আবার সংগ্রহ করতে পারি, এবং ফলাফলটিতে প্রয়োগ .values('text()[1]', ...)করতে পারি:

SELECT
  (
    SELECT
      n.n.value('text()[1]', 'varchar(50)') AS [text()]
    FROM
      @MyXml.nodes('/R/I') AS n (n)
    FOR XML
      PATH (''),
      TYPE
  ).value('text()[1]', 'varchar(50)')
;

তবে, আমি কেবলমাত্র এক্সপথ / এক্সকিউয়ের পদ্ধতিগুলি ব্যবহার করে যা করতে চাই তা এই জাতীয় কিছু:

SELECT @MyXml. ? ( ? );

এরকম উপায় আছে কি?

আমি এই দিকটিতে সমাধানের সন্ধান করার কারণটি হ'ল আমার আসল এক্সএমএলে অন্যান্য উপাদানগুলিও রয়েছে, উদাহরণস্বরূপ:

<R>
  <I>A</I>
  <I>B</I>
  <I>C</I>
  ...
  <J>X</J>
  <J>Y</J>
  <J>Z</J>
  ...
</R>

এবং আমি প্রতিটি একের জন্য অযৌক্তিক স্ক্রিপ্ট ব্যবহার না করেই একটি একক স্ট্রিং হিসাবে মান Iএবং একক স্ট্রিং হিসাবে মান উভয়ই বের করতে সক্ষম হতে চাই J

উত্তর:


11

এটি আপনার পক্ষে কাজ করতে পারে:

select @MyXml.value('/R[1]', 'varchar(50)')

এটি text()প্রথম Rএবং নীচে থেকে সমস্ত উপাদানকে তুলে নিয়েছে ।

আপনি যদি চান তবে আপনি যা text()করতে পারেন তা করতে পারেন

select @MyXml.value('.', 'varchar(50)')

আপনি যদি মানগুলি পৃথক করতে চান Iএবং Jআলাদা করে এটি করুন।

select @MyXml.query('/R/I/text()').value('.', 'varchar(50)'),
       @MyXml.query('/R/J/text()').value('.', 'varchar(50)')

চ্যাটটিতে সর্বশেষটি আমাকে পরামর্শ দেওয়া হয়েছিল তবে আমি প্রথমটিকে অত্যন্ত সহায়ক বলে মনে করি। আমি এক্সএমএল ডেটা আলাদাভাবে উত্পন্ন করতে সক্ষম হতে পারি যাতে আমি এটিতে প্রথম পদ্ধতিটি প্রয়োগ করতে পারি।
অ্যান্ড্রি এম

7

আপনার আসল এক্সএমএল কাঠামোর উপর নির্ভর করে আপনি এই জাতীয় লুপ ব্যবহার করতে পারেন:

DECLARE @xml XML

SELECT @xml = '<R>
  <I>A</I>
  <I>B</I>
  <I>C</I>
  <J>X</J>
  <J>Y</J>
  <J>Z</J>
</R>'

SELECT 
    Tbl.Col.query('for $i in I return $i').value('.', 'nvarchar(max)'),
    Tbl.Col.query('for $i in J return $i').value('.', 'nvarchar(max)')
FROM @xml.nodes('R') Tbl(Col);

যা এই ফলাফল:

(No column name) | (No column name) 
---------------  | --------------- 
ABC              | XYZ 

এই ঝাঁকুনি দেখুন


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

0

আপনার উপাদানগুলি এবং মানগুলি যদি সংক্ষিপ্ত এবং স্বতন্ত্র হয় তবে এটি কাজ করে:

declare @s varchar(99) = '<R><I>A</I><I>B</I><I>C</I></R>';

select
    @s,
    REPLACE(TRANSLATE ( @s, '<>I/R', '     '), ' ', '');

তুচ্ছ এক্সএমএল এর জন্য এটি লড়াই করতে পারে, যদিও।


উপাদানগুলি সংক্ষিপ্ত হতে পারে, তবে সাধারণ মানগুলি হয় না এবং আমি নিশ্চিত হতে পারি না যে তারা উপাদানগুলির নামের মতো একই অক্ষর ধারণ করবে না। যদিও বক্সের বাইরের পদ্ধতির বাইরে প্রশংসা করুন।
অ্যান্ড্রি এম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.