এসকিউএল সার্ভার এক্সএমএল কলামে আমি কীভাবে কোনও মান জিজ্ঞাসা করতে পারি


127

আমি Rolesএসকিউএল সার্ভার ডাটাবেসে একটি এক্সএমএল কলামে (ডাকা ) সঞ্চিত XML অনুসরণ করেছি ।

<root>
   <role>Alpha</role>
   <role>Beta</role>
   <role>Gamma</role>
</root>

আমি সমস্ত সারিগুলির তালিকাতে চাই যাগুলির একটি নির্দিষ্ট ভূমিকা রয়েছে। এই ভূমিকাটি পরামিতি দ্বারা উত্তীর্ণ হয়েছে।

উত্তর:


198
select
  Roles
from
  MyTable
where
  Roles.value('(/root/role)[1]', 'varchar(max)') like 'StringToSearchFor'

এই পৃষ্ঠাগুলি আপনাকে কীভাবে টি এসকিউএল-এ এক্সএমএলকে জিজ্ঞাসা করবেন সে সম্পর্কে আরও প্রদর্শন করবে:

টি-স্কেল ব্যবহার করে এক্সএমএল ক্ষেত্রগুলি অনুসন্ধান করা

এসকিউএল সার্ভারে এক্সএমএল ডেটা সমতলকরণ

সম্পাদনা

এটির সাথে আরও কিছুটা খেলার পরে, আমি এই আশ্চর্যজনক ক্যোয়ারীটি দিয়ে শেষ করে যা ক্রস প্রয়োগ প্রয়োগ করে uses । আপনি নিজের মত প্রকাশের জন্য যে মূল্য রেখেছেন তার জন্য এটি প্রতিটি সারি (ভূমিকা) অনুসন্ধান করবে ...

এই টেবিল কাঠামো দেওয়া:

create table MyTable (Roles XML)

insert into MyTable values
('<root>
   <role>Alpha</role>
   <role>Gamma</role>
   <role>Beta</role>
</root>')

আমরা এটি এর মতো জিজ্ঞাসা করতে পারি:

select * from 

(select 
       pref.value('(text())[1]', 'varchar(32)') as RoleName
from 
       MyTable CROSS APPLY

       Roles.nodes('/root/role') AS Roles(pref)
)  as Result

where RoleName like '%ga%'

আপনি এসকিউএল ফিডলটি এখানে চেক করতে পারেন: http://sqlfizz.com/#!18/dc4d2/1/0


5
এটি আমার সমস্ত প্রশ্নের উত্তর দেয়, [1]আপনার উত্তরে কী করবে?
বিস্ট্রো

1
দুর্দান্ত উত্তর, আমি
এটির

7
@ বিস্ট্রো সম্পর্কে জিজ্ঞাসা [1]করা সত্যিই একটি ভাল প্রশ্ন ছিল। এর অর্থ হ'ল আপনি এক্সএমএল থেকে প্রথম ভূমিকার মানটি বেছে নিয়েছেন এবং এর অর্থ এটি Alphaআপনার নমুনা এক্সএমএল অনুসন্ধানের জন্য কাজ করবে । আপনি সন্ধান করলে এটি সারিটি খুঁজে পাবেন না Beta
মিকেল এরিকসন

1
আমার ক্ষেত্রে, আমাকে নির্দিষ্ট বৈশিষ্ট্যযুক্ত মান সহ নোডগুলি জিজ্ঞাসা করতে হয়েছিল। এই উত্তরটি আমার সমাধানের নেতৃত্ব দিয়েছিল। আমাকে কেবল গুণকের চারপাশে ডাবল উদ্ধৃতি দিতে হয়েছিল।
জন এন

যদি এক্সএমএলের একটি নেমস্পেস থাকে তবে আমরা কীভাবে এটি জিজ্ঞাসা করব?
এফএমএফএফ

36
declare @T table(Roles xml)

insert into @T values
('<root>
   <role>Alpha</role>
   <role>Beta</role>
   <role>Gamma</role>
</root>')

declare @Role varchar(10)

set @Role = 'Beta'

select Roles
from @T
where Roles.exist('/root/role/text()[. = sql:variable("@Role")]') = 1

আপনি যদি ক্যোয়ারীটি where col like '%Beta%'ব্যবহার করতে পারেন তেমন কাজ করতে চানcontains

declare @T table(Roles xml)

insert into @T values
('<root>
   <role>Alpha</role>
   <role>Beta</role>
   <role>Gamma</role>
</root>')

declare @Role varchar(10)

set @Role = 'et'

select Roles
from @T
where Roles.exist('/root/role/text()[contains(., sql:variable("@Role"))]') = 1

13

আপনার ক্ষেত্রের নাম যদি ভূমিকা এবং টেবিলের নামটি টেবিল 1 হয় তবে আপনি অনুসন্ধানের জন্য নিম্নলিখিত ব্যবহার করতে পারেন

DECLARE @Role varchar(50);
SELECT * FROM table1
WHERE Roles.exist ('/root/role = sql:variable("@Role")') = 1

এটি ভাল, ব্যবহারের সন্ধান করার কোনও উপায় এখানে আছে like? forexample /root/role like ....
বিস্ট্রো

2
লেনিয়েলের ব্যাখ্যা অনুসারে ব্যবহার .value('(/root/role)[1]', 'varchar(max)') like '%yourtext%'করুনexists
এএএ

4
আপনি কি এই চেষ্টা করেছেন? আপনি যা .োকালেন তা নির্বিশেষে এটি সমস্ত কিছু সন্ধান করে @Role
মিকেল এরিকসন

6

আমি নীচে কাছাকাছি একটি সাধারণ কাজ নিয়ে এসেছি যা খুব মনে রাখাও সহজ :-)

select * from  
(select cast (xmlCol as varchar(max)) texty
 from myTable (NOLOCK) 
) a 
where texty like '%MySearchText%'

1
আমরা স্ট্রিং ম্যানিপুলেশন দিয়ে অনুসন্ধান করার কথা নেই, কারণ এর ফলে খুব ধীর অনুসন্ধানগুলি হতে পারে
ম্যালকম সালভাদোর

5

আপনি নিম্নলিখিত করতে পারে

declare @role varchar(100) = 'Alpha'
select * from xmltable where convert(varchar(max),xmlfield) like '%<role>'+@role+'</role>%'

স্পষ্টতই এটি কিছুটা হ্যাক এবং আমি কোনও আনুষ্ঠানিক সমাধানের জন্য এটি প্রস্তাব করব না। তবে এসকিউএল সার্ভার ২০১২-এর এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে এক্সএমএল কলামগুলিতে অ্যাডহোক ক্যোয়ারীগুলি করার সময় আমি এই কৌশলটি খুব দরকারী বলে মনে করি।


2

দরকারী টিপস। এসকিউএল সার্ভার এক্সএমএল কলামে একটি নাম জিজ্ঞাসা করুন (নেমস্পেস সহ এক্সএমএল)

যেমন

Table [dbo].[Log_XML] contains columns Parametrs (xml),TimeEdit (datetime)

যেমন প্যারামিটারগুলিতে এক্সএমএল:

<ns0:Record xmlns:ns0="http://Integration"> 
<MATERIAL>10</MATERIAL> 
<BATCH>A1</BATCH> 
</ns0:Record>

যেমন প্রশ্ন:

select
 Parametrs,TimeEdit
from
 [dbo].[Log_XML]
where
 Parametrs.value('(//*:Record/BATCH)[1]', 'varchar(max)') like '%A1%'
 ORDER BY TimeEdit DESC

1

আমি এসকিএল টেবিলের এক্সএমএলে মানগুলি পুনরুদ্ধার করতে নীচের বিবৃতিটি ব্যবহার করেছি

with xmlnamespaces(default 'http://test.com/2008/06/23/HL.OnlineContract.ValueObjects')
select * from (
select
            OnlineContractID,
            DistributorID,
            SponsorID,
    [RequestXML].value(N'/OnlineContractDS[1]/Properties[1]/Name[1]', 'nvarchar(30)') as [Name]
   ,[RequestXML].value(N'/OnlineContractDS[1]/Properties[1]/Value[1]', 'nvarchar(30)') as [Value]
     ,[RequestXML].value(N'/OnlineContractDS[1]/Locale[1]', 'nvarchar(30)') as [Locale]
from [OnlineContract]) as olc
where olc.Name like '%EMAIL%' and olc.Value like '%EMAIL%' and olc.Locale='UK EN'

এক্সএমএলে যদি নেমস্পেস সংজ্ঞা থাকে না তবে কী হবে?
মুফ্লিক্স

0

আপনি পুরো ট্যাগটি, বা কেবল নির্দিষ্ট মানটি জিজ্ঞাসা করতে পারেন। এখানে আমি এক্সএমএল নেমস্পেসের জন্য একটি ওয়াইল্ডকার্ড ব্যবহার করি।

declare @myDoc xml
set @myDoc = 
'<Root xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://stackoverflow.com">
    <Child>my value</Child>
 </Root>'

select @myDoc.query('/*:Root/*:Child') -- whole tag
select @myDoc.value('(/*:Root/*:Child)[1]', 'varchar(255)') -- only value
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.