2010-09-17 10 views
6
-- Given a CSV string like this: 

declare @roles varchar(800) 
select @roles = 'Pub,RegUser,ServiceAdmin' 

-- Question: How to get roles into a table view like this: 

select 'Pub' 
union 
select 'RegUser' 
union 
select 'ServiceAdmin' 

इस पोस्ट करने के बाद, मैं कुछ गतिशील एसक्यूएल के साथ खेलना शुरू कर दिया। ऐसा लगता है, लेकिन ऐसा लगता है कि गतिशील एसक्यूएल का उपयोग करके कुछ सुरक्षा जोखिम हो सकते हैं - इस पर विचार?एक एसएसवी स्ट्रिंग को टीएसक्यूएल में एक टेबल में बदलने के लिए सबसे संक्षिप्त तरीका?

declare @rolesSql varchar(800) 
select @rolesSql = 'select ''' + replace(@roles, ',', ''' union select ''') + '''' 
exec(@rolesSql) 

उत्तर

10

मेरा देखें से here

का जवाब लेकिन मूल रूप से आप होगा:

इस समारोह अपने DB में बनाएँ:

CREATE FUNCTION dbo.Split(@origString varchar(max), @Delimiter char(1))  
returns @temptable TABLE (items varchar(max))  
as  
begin  
    declare @idx int  
    declare @split varchar(max)  

    select @idx = 1  
     if len(@origString)<1 or @origString is null return  

    while @idx!= 0  
    begin  
     set @idx = charindex(@Delimiter,@origString)  
     if @idx!=0  
      set @split= left(@origString,@idx - 1)  
     else  
      set @split= @origString 

     if(len(@split)>0) 
      insert into @temptable(Items) values(@split)  

     set @origString= right(@origString,len(@origString) - @idx)  
     if len(@origString) = 0 break  
    end 
return  
end 

और फिर फ़ंक्शन को कॉल करें और स्ट्रिंग आप विभाजित करना चाहते हैं में गुजरती हैं।

Select * From dbo.Split(@roles, ',') 
+0

धन्यवाद, यह एक अच्छा काम है। –

+2

टीवीएफ हाँ? यह चयन नहीं होगा * dbo.Split (@roles, ',') से ?? – Sinaesthetic

0

बल्क सम्मिलित उपयोग करके आप अपनी एसक्यूएल तालिका में एक csv फ़ाइल आयात कर सकते हैं -

http://blog.sqlauthority.com/2008/02/06/sql-server-import-csv-file-into-sql-server-using-bulk-insert-load-comma-delimited-file-into-sql-server/

+3

क्या एक आम तरीका है यह करने के लिए है? ओपी ने कहा कि एक सीएसवी ** स्ट्रिंग ** फ़ाइल नहीं – codingbadger

6

आप एसक्यूएल सर्वर अनुकूलता स्तर 130 के साथ काम कर रहे हैं तो STRING_SPLIT समारोह अब सबसे संक्षिप्त विधि उपलब्ध है।

संदर्भ लिंक: https://msdn.microsoft.com/en-gb/library/mt684588.aspx

उपयोग:

SELECT * FROM string_split('Pub,RegUser,ServiceAdmin',',') 

RESULT: 

value 
----------- 
Pub 
RegUser 
ServiceAdmin 
0

एसक्यूएल सर्वर के लिए एक विकल्प भी XML पार्सिंग में बनाया गया है का उपयोग करना। बेशक, यह आरएफसी -4180 अनुपालन सीएसवी की सभी बारीकियों पर चमकता है।

-- Given a CSV string like this: 
declare @roles varchar(800) 
select @roles = 'Pub,RegUser,ServiceAdmin' 

-- Here's the XML way 
select split.csv.value('.', 'varchar(100)') as value 
from (
    select cast('<x>' + replace(@roles, ',', '</x><x>') + '</x>' as xml) as data 
) as csv 
cross apply data.nodes('/x') as split(csv) 

आप एसक्यूएल 2016+ उपयोग कर रहे हैं, string_split बेहतर है का उपयोग करते हुए, लेकिन इस एसक्यूएल 2016 से पहले

संबंधित मुद्दे

 संबंधित मुद्दे