Frage

Ich habe vier Tabellen:. Nachrichten, Message, MessageStatus und MessageLevel

Message, MessageStatus und MessageLevel alle haben nur drei Felder: Identität (Primärschlüssel), Code und Beschreibung. Meldungen beziehen sich auf diese drei Felder und haben ein paar anderen Datenfelder, einschließlich der Identität (Primärschlüssel) und Message Order. Die Identity-Felder werden automatisch erhöht Felder aus.

Ich brauche jetzt einen SQL-Skript zu schreiben, um alle vier Tabellen einige Standarddaten hinzuzufügen. Das Problem ist, ich brauche ein Skript zu erstellen, die an einen Kunden geschickt wird, die dieses Skript dann ausführt. Ich kann nicht ein bisschen intelligenten Code zu tun, um die gesamte Update schreiben. Und während drei Tabellen sind nur einfache Insert-Anweisungen, es ist die Nachrichten-Tabelle, die mir einige zusätzliche Kopfschmerzen verursacht.

Ich kann keine Indizes entfernen, und ich kann es nicht annehmen, das Zählen bei 1 für den Primärschlüssel gestartet wird.

So, als Beispiel, sie ist einige Daten:

INSERT INTO MessageCategory (Code) Values ('Cat01');
INSERT INTO MessageStatus (Code) Values ('Status01');
INSERT INTO MessageLevel (Code) Values ('Level01');

Und die Nachrichten würden so etwas wie dieses brauchen:

INSERT INTO Messages(Category, Status, Level, MessageText, Order) 
VALUES(
  (SELECT Identity from MessageCategory where Code='Cat01'), 
  (SELECT Identity from MessageStatus where Code='Status01'), 
  (SELECT Identity from MessageLevel where Code='Level01'), 
  'Just some message', 
  1
);

Das wird nicht funktionieren, wenn. Also, was ist der Trick diese Arbeit zu bekommen? (Halten Sie den Code lesbar zu ...)

Leider habe ich keinen Zugriff auf die andere Datenbank. Ich kann es testen, aber sobald es zu funktionieren scheint, es ist nur eine Frage der Sende-und-beten-it-Werk ...

War es hilfreich?

Lösung

INSERT INTO Messages 
  (Category, Status, Level, MessageText, [Order]) 
SELECT
  (SELECT TOP 1 [Identity] from MessageCategory where Code='Cat01')  AS Category,
  (SELECT TOP 1 [Identity] from MessageStatus where Code='Status01') AS Status,
  (SELECT TOP 1 [Identity] from MessageLevel where Code='Level01')   AS Level,
  (SELECT 'Just some message')   AS MessageText, 
  (SELECT 1)                     AS [Order]

Das oben würde für SQL Server arbeiten. Beachten Sie, dass beide Identity und Order sind T-SQL-Schlüsselwörter reserviert und sollten nicht für Spaltennamen verwendet werden. Beachten Sie auch, dass Unterabfragen dürfen nicht mehr als eine Zeile für diese Arbeit zurückkehren, um sicherzustellen, dass ich TOP 1 Aussagen enthalten sind.

Das nächste, was zu beachten ist, dass die Spalte Aliase (AS Category etc.) ist nicht unbedingt erforderlich. Ihre Reihenfolge ist, was zählt. Ich würde sie zur besseren Lesbarkeit ist, vor allem, wenn die SELECT-Liste wird immer länger.

Andere Tipps

Wenn es ein einzelnes Skript ist, speichern Sie Ihre Identitäten in Variablen:

declare MessageCategoryID int;
declare MessageStatusID int;
declare MessageLevel int;
INSERT INTO MessageCategory (Code) Values ('Cat01');
set @MessageCategoryID=scope_identity();
INSERT INTO MessageStatus (Code) Values ('Status01');
set @MessageStatudID=scope_identity();
INSERT INTO MessageLevel (Code) Values ('Level01');
set @MessageLevelID=scope_identity();

INSERT INTO Messages(Category, Status, Level, MessageText, Order) 
    VALUES(
        @MessageCAtegoryID,
        @MessageStatusID,
        @MessageLevelID,
        'Just some message',
        1);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top