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;