2016-03-25 4 views
1

in dem SQL Server Management Studio existiere ich ging Scripts zu generieren und eine INSERT-Skript zu erstellen, die wie folgt aussieht:Erstellen eines SQL-Skript, das mehrere Elemente in eine Tabelle einfügt, aber zu überprüfen, ob jeder erste

SET IDENTITY_INSERT [dbo].[Product] ON 
GO 
INSERT [dbo].[Product] ([Id], [Name]) VALUES (1, N'Product 1') 
GO 
INSERT [dbo].[Product] ([Id], [Name]) VALUES (2, N'Product 2') 
GO 
INSERT [dbo].[Product] ([Id], [Name]) VALUES (3, N'Product 3') 
GO 
SET IDENTITY_INSERT [dbo].[Product] OFF 
GO 

Lassen Sie uns sagen Ich habe mehrere Client-Datenbanken, und ich möchte in der Lage sein, dieses Skript sicher auf allen von ihnen auszuführen, ob diese Produkte bereits vorhanden sind oder nicht. Muss ich wirklich jede einzelne Insert-Zeile mit einem Wenn vorhanden oder gibt es einen besseren Weg?

Der ultimative Plan ist, es als ein Post-Deployment-Skript in einem SQL SERVER-Datenbankprojekt für Tabellen zu verwenden, die Elemente wie Systemeinstellungen enthalten.

Antwort

3

Warum nicht alle Einsätze in einem Schritt?

INSERT [dbo].[Product] ([Id], [Name]) 
    SELECT id, name 
    FROM (VALUES (1, N'Product 1'), 
       (2, N'Product 2') 
       (3, N'Product 3') 
     ) v(Id, Name) 
    WHERE NOT EXISTS (SELECT 1 FROM Product P2 WHERE p2.id = v.id); 
3
SET IDENTITY_INSERT [dbo].[Product] ON 
GO 
INSERT [dbo].[Product] ([Id], [Name]) 
select id,name from products t where not exists(select 1 from products t2 where t2.id=t1.id and t2.name=t1.name 
GO 
SET IDENTITY_INSERT [dbo].[Product] OFF 
0

Ein Muster, das ich vor kurzem gefolgt sind, die auch in Ihrer Situation passen könnte:

SELECT name 
INTO #My_Table 
FROM dbo.My_Table 
WHERE 1=0 

INSERT INTO #My_Table 
VALUES 
    ('One'), 
    ('Two') 
    ... etc. 

INSERT INTO dbo.My_Table (id, name) 
SELECT id, name 
FROM #My_Table 
WHERE name NOT IN (SELECT name FROM My_Table) 

DROP TABLE #My_Table 

Dies setzt voraus, dass id ist nur eine IDENTITY Spalte und dass name ist die wahre Kennung mit einem UNIQUE Einschränkung auf es. Wenn Ihre Struktur anders ist, können Sie sich entsprechend anpassen.

Wenn die Einzigartigkeit der Reihe nach mehr als einer Spalte bestimmt wird, dann können Sie eine alternative Methode verwenden, um die Existenz zu überprüfen (LEFT OUTER JOIN und prüfen, ob NULL oder eine Unterabfrage, etc.)

Ich finde, dass auf diese Weise können Ich behalte alle Daten in der Tabelle in einem praktischen, leicht lesbaren Format, das in der VALUES leicht zu pflegen ist.