SQL Server: existe-t-il un moyen d'insert dans une table des valeurs en utilisant à la fois SELECT et VALUES en même time?

J'essaie de mettre en place un triggersur qui va insert certaines valeurs d'une table et spécifier d'autres valeurs avec la command VALUES . Quelque chose comme le code ci-dessous:

 INSERT INTO table_name(ID, Name, Email) SELECT userID, userName FROM users_table WHERE condition1 VALUES ('[email protected]') 

Comme vous pouvez le voir, j'essaie d'aller chercher les 2 premières valeurs pour l' ID et le Name d'une table et pour l' email je veux spécifier une valeur.

J'ai aussi une colonne d'auto-incrémentation (appelée crt ) dans table_name si cela est pertinent. Alors, comment puis-je faire cela?

La command INSERT existe en deux versions:

(1) soit vous avez toutes vos valeurs disponibles, comme des littéraux ou des variables SQL Server – dans ce cas, vous pouvez utiliser l'approche INSERT .. VALUES() :

 INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN) VALUES(Value1, Value2, @Variable3, @Variable4, ...., ValueN) 

Note: Je recommand de toujours spécifier explicitement la list des colonnes à insert dans datatables – de cette façon, vous n'aurez pas de mauvaises sursockets si soudainement votre table a une colonne supplémentaire, ou si vos tables ont une IDENTITY ou une colonne calculée. Oui – c'est un petit peu plus de travail – une fois – mais alors vous avez votre instruction INSERT aussi solide que possible et vous n'aurez pas à constamment jouer avec si votre table change.

(2) si vous n'avez pas toutes vos valeurs en tant que littéraux et / ou variables, mais que vous souhaitez utiliser une autre table, plusieurs tables ou vues pour fournir les valeurs, vous pouvez utiliser INSERT ... SELECT ... approche:

 INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN) SELECT SourceColumn1, SourceColumn2, @Variable3, @Variable4, ...., SourceColumnN FROM dbo.YourProvidingTableOrView 

Ici, vous devez définir exactement autant d'éléments dans le SELECT que votre INSERT s'attend – et ceux-ci peuvent être des colonnes de la (des) table (s) (ou vue (s)), ou ceux-ci peuvent être des littéraux ou des variables. Encore une fois: fournir explicitement la list des colonnes à insert dans – voir ci-dessus.

Vous pouvez utiliser l' un ou l'autre – mais vous ne pouvez pas mélanger les deux – vous ne pouvez pas utiliser SELECT et avoir une clause VALUES(...) au milieu – choisissez l'une des deux – respectez-la.

Donc, dans votre cas concret, utilisez simplement:

 INSERT INTO dbo.table_name (ID, Name, Email) SELECT userID, userName, '[email protected]' FROM users_table WHERE condition1 

quelque chose comme ça,

 INSERT INTO table_name (ID, Name, Email) SELECT userID, userName, '[email protected]' AS Email FROM users_table WHERE ..condition1.. 

1)

 INSERT INTO dbo.TargetTable(...) SELECT Col1, Col2, ... FROM ... WHERE ... UNION ALL SELECT 'Constant1' AS Col1, 2 AS Col2, '2013-12-27T00:00:00' AS Col3 UNION ALL SELECT 'Constant2' AS Col1, 3 AS Col2, '2013-12-28T00:00:00' AS Col3 

2)

 DECLARE @AllRows TABLE(Col1 VARCHAR(50), Col2 INT, Col3 DATETIME); INSERT INTO @AllRows (...) SELECT Col1, Col2, ... FROM ... WHERE ... INSERT INTO @AllRows (...) VALUES ('Constant1', 2, '2013-12-27T00:00:00'); INSERT INTO @AllRows (...) VALUES ('Constant2', 3, '2013-12-28T00:00:00'); INSERT INTO dbo.TargetTable(...) SELECT Col1, Col2, Col3 FROM @AllRows;