2010-09-22 3 views
3

J'ai un script qui doit insérer plus de 50 lignes dans une table, y a-t-il un moyen de boucler chaque ligne que je veux insérer, plutôt que de coder 50 fois cette instruction dans TSQL?boucle à travers de nombreux "si existe mise à jour, sinon insérer" des déclarations?

IFEXISTS (SELECT 1 FROM table where column 1 =) 
    UPDATE table 
    Column1 = value, 
    Column2 = value, 
    Column3 = value, 
    Column4 = value 
    WHERE column 1 = 
    ELSE 
    INSERT INTO table 
    (Column1, Column2, Column3, Column4) 
    VALUES 
    (value, value, value, value) 
+1

Quelle version de SQL Server? Si 2008 vous pouvez utiliser 'Merge' sur une variable de table contenant à la fois des lignes nouvelles et existantes. –

+0

SQL Server 2005 - doh – user234702

+0

Pourquoi les utilisateurs répondent-ils aux questions dans les commentaires? –

Répondre

7

Encore mieux, vous pouvez mettre les enregistrements dans une table temporaire, puis mettre à jour tout ce qui existe et insérer tout ce qui n'existe pas avec deux requêtes.

Exemple:

select Column1 = 1, Column2 = 2, Column3 = 3 
into #temp 
union all select 1,2,3 
union all select 1,2,3 
union all select 1,2,3 
... 
union all select 1,2,3 

update t 
set Column1 = p.Column1, Column2 = p.Column2, Column3 = p.Column3 
from table t 
inner join #temp p on p.Column1 = t.Column1 

insert into table (Column1, Column2, Column3) 
select p.Column1, p.Column2, p.Column3 
from #temp p 
left join table t on t.Column1 = p.Column1 
where t.Column1 is null 

drop table #temp 
+0

Testé avec quelques lignes et semble fonctionner fantastique. Merci beaucoup pour ça. – user234702

0

Bien, SQL est un langage basé sur SET donc idéalement vous le gardez dans un ensemble. Pour faire une boucle itérative, vous pouvez utiliser un curseur, mais pourquoi?

Voici une autre approche hors d'un MSDN blog:

UPDATE Table1 SET (...) WHERE Column1='SomeValue' 
IF @@ROWCOUNT=0 
    INSERT INTO Table1 VALUES (...) 
0

Tenir compte de la déclaration MERGE (et plus particulièrement le premier exemple sur la page liée).

Cela vous permet de définir des opérations d'ajout, de mise à jour ou de suppression lors de la comparaison du contenu d'une table et d'une requête de sélection.

Questions connexes