2010-09-17 9 views

Respuesta

10

Ver mi responder desde here

Pero básicamente usted:

Crear esta función en su base de datos:

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 

y luego llamar a la función y pasar en la cadena que desea dividir.

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

Gracias, que es una gran función. –

+2

TVF, ¿sí? ¿No sería SELECCIONAR * DE dbo.Split (@roles, ',') ?? – Sinaesthetic

6

Si está trabajando con el nivel de compatibilidad 130 de SQL Server, la función STRING_SPLIT es ahora el método más breve disponible.

enlace Referencia: https://msdn.microsoft.com/en-gb/library/mt684588.aspx

Uso:

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

RESULT: 

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

Usando construido en el análisis de XML es también una opción de SQL Server. Por supuesto, esto pasa por alto todos los matices de un CSV compatible con RFC-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) 

Si está utilizando SQL 2016+, utilizando string_split es mejor, pero esto es una forma común de hacer esto antes de SQL 2016.

Cuestiones relacionadas