Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

जहां क्लॉज में स्ट्रिंग्स की सूची बनाने के लिए अल्पविराम से अलग किए गए स्ट्रिंग को पार्स करें

यह फ़ंक्शन बनाएं (sqlserver 2005+)

CREATE function [dbo].[f_split]
(
@param nvarchar(max), 
@delimiter char(1)
)
returns @t table (val nvarchar(max), seq int)
as
begin
set @param += @delimiter

;with a as
(
select cast(1 as bigint) f, charindex(@delimiter, @param) t, 1 seq
union all
select t + 1, charindex(@delimiter, @param, t + 1), seq + 1
from a
where charindex(@delimiter, @param, t + 1) > 0
)
insert @t
select substring(@param, f, t - f), seq from a
option (maxrecursion 0)
return
end

इस कथन का प्रयोग करें

SELECT *
FROM yourtable 
WHERE account in (SELECT val FROM dbo.f_split(@account, ','))

मेरे स्प्लिट फ़ंक्शन की तुलना XML स्प्लिट से करना:

टेस्टडेटा:

select top 100000 cast(a.number as varchar(10))+','+a.type +','+ cast(a.status as varchar(9))+','+cast(b.number as varchar(10))+','+b.type +','+ cast(b.status as varchar(9)) txt into a 
from master..spt_values a cross join master..spt_values b

एक्सएमएल:

 SELECT count(t.c.value('.', 'VARCHAR(20)'))
 FROM (
     SELECT top 100000 x = CAST('<t>' + 
           REPLACE(txt, ',', '</t><t>') + '</t>' AS XML)
           from a
 ) a
 CROSS APPLY x.nodes('/t') t(c)

Elapsed time: 1:21 seconds

f_split:

select count(*) from a cross apply clausens_base.dbo.f_split(a.txt, ',')

Elapsed time: 43 seconds

यह रन से रन में बदल जाएगा, लेकिन आपको इसका अंदाजा हो जाएगा



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्रिस्टल रिपोर्ट बनाम माइक्रोसॉफ्ट एसक्यूएल सर्वर रिपोर्टिंग सेवाएं

  2. आप SQL सर्वर 2005 डेटाबेस के सभी मौजूदा कनेक्शन कैसे मारते हैं?

  3. 'COLLATE SQL_Latin1_General_CP1_CI_AS' क्या करता है?

  4. SQL सर्वर में लोअरकेस को अपरकेस में कैसे बदलें - UPPER ()

  5. pyodbc.connect() काम करता है, लेकिन sqlalchemy.create_engine().connect() नहीं