web-dev-qa-db-fra.com

INSÉRER DANS LE TABLEAU à partir de la liste varchar séparée par des virgules

Peut-être que je ne vois pas le bois pour les arbres mais je suis coincé, alors voici la question:

Comment puis-je importer/insérer une liste de valeurs varchar séparées par des virgules dans une table? Je ne veux pas dire quelque chose comme ça:

  • '12345678,87654321,11223344' mais ça:
  • '12345678','87654321','11223344'

J'ai une fonction Split- mais elle semble inutile dans ce cas, n'est-ce pas?

Voici un exemple simple (mock-SQL) pour montrer ce que je veux dire:

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;

Merci d'avance.

25
Tim Schmelter

Puisqu'il n'y a aucun moyen de simplement passer cette "liste de varchars séparés par des virgules", je suppose qu'un autre système les génère. Si vous pouvez modifier légèrement votre générateur, il devrait être réalisable. Plutôt que de séparer par des virgules, vous séparez par union all select, et vous devez ajouter un select à la liste. Enfin, vous devez fournir des alias pour la table et la colonne dans votre sous-sélection:

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;

Mais en notant votre commentaire à une autre réponse, à propos d'avoir 5000 entrées à ajouter. Je pense que la limitation 256 tables par sélection peut se déclencher avec le modèle "union all" ci-dessus, vous devrez donc encore fractionner ces valeurs en instructions distinctes.

14

Quelque chose comme ça devrait fonctionner:

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

MISE À JOUR:

Apparemment, cette syntaxe n'est disponible qu'à partir de SQL Server 2008.

44
André Morujão

Sql Server n'a pas (à ma connaissance) de fonction Split intégrée. La fonction de division en général sur toutes les plates-formes aurait une valeur de chaîne séparée par des virgules à diviser en chaînes individuelles. Dans sql server, l'objectif principal ou nécessaire de la fonction Split est de convertir une valeur de chaîne séparée par des virgules ("abc, cde, fgh") en une table temporaire avec chaque chaîne comme lignes.

La fonction Split ci-dessous est une fonction de valeur de table qui nous aiderait à diviser une chaîne séparée par des virgules (ou toute autre valeur de délimiteur) en chaîne individuelle.

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  

sélectionnez le top 10 * de dbo.split ('Chennai, Bangalore, Mumbai', ',')

l'intégralité peut être trouvée sur le lien suivant http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table. aspx

10
rahularyansharma