Question

J'ai quatre tableaux:. Messages, MessageCategory, MessageStatus et MessageLevel

MessageCategory, MessageStatus et MessageLevel tous ont seulement trois domaines: l'identité (clé primaire), Code et description. Messages fait référence à ces trois domaines et a quelques autres champs de données, y compris l'identité (clé primaire) et MessageText Ordre. Les champs d'identité sont des champs incrémentée automatiquement.

J'ai besoin maintenant d'écrire un script SQL pour ajouter des données par défaut à quatre tables. Le problème est, je dois créer un script qui sera envoyé à un client qui sera ensuite exécuter ce script. Je ne peux pas écrire un peu plus de code intelligent pour faire la mise à jour tout. Et tandis que trois tables sont de simples instructions d'insertion, il est la table des messages qui me provoque des maux de tête supplémentaires.

Je ne peux pas supprimer tous les indices et je ne peux pas supposer qu'il compte à 1 pour les clés primaires.

Ainsi, à titre d'exemple, elle est des données:

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

Et les messages auraient besoin de quelque chose comme ceci:

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

Cela ne fonctionne pas, cependant. Alors, quel est le truc pour obtenir ce travail? (Garder le code lisible aussi ...)

Malheureusement, je n'ai pas accès à l'autre base de données. Je peux le tester, mais une fois qu'il semble fonctionner, il est juste une question d'envoi et prier-it usine ...

Était-ce utile?

La solution

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]

Ce qui précède travailler pour SQL Server. Notez que les deux Identity et Order sont des mots réservés T-SQL et ne doivent pas être utilisés pour les noms de colonnes. Notez également que les sous-requêtes ne doivent pas retourner plus d'une ligne pour que cela fonctionne, pour faire en sorte que j'ai inclus des déclarations de TOP 1.

La prochaine chose à noter est que les alias de colonne (AS Category etc.) ne sont pas strictement nécessaires. Leur ordre est ce qui compte. Je les inclure pour une meilleure lisibilité, surtout lorsque la liste SELECT obtient plus.

Autres conseils

Si c'est un seul script, stocker vos identités dans les variables:

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top