Domanda

Ho quattro tabelle:. Messaggi, MessageCategory, MessageStatus e MessageLevel

MessageCategory, MessageStatus e MessageLevel tutti appena hanno tre campi: Identity (chiave primaria), Codice e descrizione. I messaggi si riferisce a questi tre campi e ha un paio di altri campi di dati, tra cui Identity (chiave primaria) MessageText e Ordine. I campi di identità sono campi auto-incrementato.

Ora ho bisogno di scrivere uno script SQL per aggiungere alcuni dati di default per tutti i quattro tavoli. Il problema è, ho bisogno di creare uno script che verrà inviata ad un cliente che poi eseguire questo script. Non posso scrivere un codice più intelligente po 'per fare l'intero aggiornamento. E mentre tre tavoli sono solo semplici istruzioni di inserimento, è la tabella dei messaggi che mi provoca qualche mal di testa supplementari.

Non posso rimuovere eventuali indici e non posso supporre che inizia il conteggio a 1 per le chiavi primarie.

Così, ad esempio, il suo è un po 'di dati:

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

E i messaggi avrebbero bisogno di qualcosa come questo:

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
);

Non funziona, però. Allora, qual è il trucco per ottenere questo lavoro? (Mantenere il codice leggibile troppo ...)

Purtroppo, non ho accesso al altro database. Posso provarlo, ma una volta sembra funzionare, è solo una questione di invio e pregare-da-opere ...

È stato utile?

Soluzione

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]

È possibile che questo avrebbe funzionato per SQL Server. Si noti che sia Identity e Order sono riservati parole chiave T-SQL e non devono essere utilizzati per i nomi delle colonne. Si noti inoltre che sub-query non devono restituire più di una riga per far funzionare tutto questo, per garantire che ho incluso le dichiarazioni TOP 1.

La prossima cosa da notare è che gli alias di colonna (AS Category etc.) non sono strettamente necessari. Il loro fine è ciò che conta. Io li includere per migliorare la leggibilità, soprattutto quando la lista si allunga SELEZIONE.

Altri suggerimenti

Se si tratta di un singolo script, memorizzare le identità nelle variabili:

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top