Est-il possible d'utiliser conditionnellement des valeurs de colonne par défaut dans une instruction INSERT..SELECT?

StackOverflow https://stackoverflow.com/questions/2366580

Question

J'ai eu un code similaire à ce qui suit dans une procédure stockée qui insère une ligne dans une table, je voudrais mettre la dernière colonne (FieldD) à moins qu'il ne soit @prmSomeValue nulle, sinon il suffit d'utiliser la valeur par défaut défini pour cette colonne.

IF (@prmSomeValue IS NULL)
   INSERT INTO MyTable (fieldA,FieldB,FieldC)  
      SELECT A,B,C 
      FROM MyOtherTable
ELSE
   INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)  
      SELECT A,B,C,@prmSomeValue 
      FROM MyOtherTable

Cela fonctionne, mais viole le principe DRY. Je suis en train de trouver un moyen de le faire avec une seule instruction d'insertion. Quelque chose le long des lignes du pseudo-code suivant.

   INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)  
      SELECT A,B,C,ISNULL(@prmSomeValue,DEFAULT)
      FROM MyOtherTable

Quelqu'un a des idées?

Mise à jour - Encore une torsion La contrainte par défaut est pas une valeur littérale, mais une fonction comme indiqué ci-dessous.

...DEFAULT (suser_sname()) FOR [FieldD]

Mise à jour J'ai finalement botté et a choisi le moindre des maux et juste recopié la fonction de valeur par défaut dans ma requête au lieu de tomber par la valeur par défaut configurée pour la colonne. Je ne l'aime pas, mais il fait le travail avec moins de répétitions dans ma requête.

   INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)  
      SELECT A,B,C,ISNULL(@prmSomeValue,suser_sname())
      FROM MyOtherTable
Était-ce utile?

La solution

Depuis essentiellement c'est ce que SQL Server fait, vous pourriez faire quelque chose comme ça au moins éviter deux déclarations presque identiques (pseudo-code):

INSERT (columnA,B,C) ... ;

IF @prmSomeValue IS NOT NULL
    UPDATE ... ;

Je ne pense pas qu'il y ait un moyen de COALESCE avec la valeur par défaut.

Autres conseils

Je dirais que votre méthode est très bien. Une simple vérification suivie d'un insert. Si vous êtes inquiet au sujet DRY, l'appel encapsuler afin qu'il soit appelé à plusieurs reprises.

Je dirais que les insertions / mises à jour sur une db peut être coûteux sur certaines tables (dépend de l'objectif de conception), donc si vous devez écrire du code supplémentaire pour gérer ce scénario alors je ne vois aucun problème avec le compromis.

peut travail, dépend si vous voulez parler de la valeur par défaut définie dans une contrainte par défaut ou dans le code? Si « contrainte » elle échoue, si « code » cela fonctionne. Modifier : vous voulez dire la contrainte. doh!

SELECT A,B,C,@prmSomeValue
      FROM MyOtherTable
      WHERE @prmSomeValue IS NOT NULL
UNION ALL
SELECT A,B,C,DEFAULT
      FROM MyOtherTable
      WHERE @prmSomeValue IS NULL

Quelle que soit la façon dont vous voulez le faire, en spécifiant une colonne dans la clause INSERT nécessite une valeur.

Donc, votre première solution est ce que vous avez do ...

Quelque chose comme cela pourrait fonctionner (quoique pas très joli):

INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)  
SELECT A,B,C,
    case when @prmSomeValue is null 
then
        (SELECT text FROM syscomments WHERE id IN (SELECT cdefault FROM syscolumns
            WHERE id = object_id('MyTable') AND cdefault > 0))
    else @prmSomeValue
    end
FROM MyOtherTable
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top