INSERTAR EN LA TABLA desde varchar-list separado por comas


Tal vez no estoy viendo la madera para los árboles, pero estoy atascado, así que aquí está la pregunta:

¿Cómo puedo importar/insertar una lista de valores varchar separados por comas en una tabla? No me refiero a algo como esto:

  • '12345678,87654321,11223344' pero esto:
  • '12345678','87654321','11223344'

Tengo una función Split-pero parece ser inútil en este caso, ¿no?

Aquí hay un ejemplo simple (mock-SQL) para mostrar lo que quiero decir:

Create Table #IMEIS(
    imei varchar(15)
)
INTO INTO #IMEIS(imei)
    SELECT * FROM ('012251000362843', '012251001084784', '012251001168744', '012273007269862', '012291000080227', '012291000383084', '012291000448515')
SELECT * from #IMEIS
DROP TABLE #IMEIS;

Gracias de antemano.

Author: Tim Schmelter, 2011-06-15

3 answers

Dado que no hay forma de pasar esta "lista separada por comas de varchars", asumo que algún otro sistema los está generando. Si puede modificar su generador ligeramente, debería ser viable. En lugar de separar por comas, se separa por union all select, y necesita anteponer un select también a la lista. Finalmente, debe proporcionar alias para la tabla y la columna en su subselección:

Create Table #IMEIS(
    imei varchar(15)
)
INSERT INTO #IMEIS(imei)
    SELECT * FROM (select '012251000362843' union all select '012251001084784' union all select '012251001168744' union all
                   select '012273007269862' union all select '012291000080227' union all select '012291000383084' union all
                   select '012291000448515') t(Col)
SELECT * from #IMEIS
DROP TABLE #IMEIS;

Pero tomando nota de su comentario a otra respuesta, acerca de tener 5000 entradas para agregar. Creo que el La limitación de 256 tablas por select puede entrar en acción con el patrón "unir todo" anterior, por lo que aún tendrá que dividir estos valores en declaraciones separadas.

 10
Author: Damien_The_Unbeliever,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-15 08:32:31

Algo como esto debería funcionar:

INSERT INTO #IMEIS (imei) VALUES ('val1'), ('val2'), ...

ACTUALIZACIÓN:

Aparentemente esta sintaxis solo está disponible a partir de SQL Server 2008.

 40
Author: André Morujão,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-15 08:12:34

Sql Server (que yo sepa) no tiene una función de división integrada. La función Split en general en todas las plataformas tendría un valor de cadena separado por comas que se dividiría en cadenas individuales. En sql server, el objetivo principal o necesario de la función Split es convertir un valor de cadena separado por comas ('abc,cde,fgh') en una tabla temporal con cada cadena como filas.

La siguiente función dividida es una función de valor de tabla que nos ayudaría a dividir separados por comas (o cualquier otra delimiter value) cadena a cadena individual.

CREATE FUNCTION dbo.Split(@String varchar(8000), @Delimiter char(1))       
returns @temptable TABLE (items varchar(8000))       
as       
begin       
    declare @idx int       
    declare @slice varchar(8000)       

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

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

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

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

Seleccione el top 10 * de dbo.split ("Chennai,Bangalore,Mumbai",",")

El completo se puede encontrar en el siguiente enlace http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx

 9
Author: rahularyansharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-15 08:11:16