在同一命令中插入,选择和插入

时间:2015-08-21 14:31:13

标签: c# sql-server

目前我正在使用以下C#代码将行插入数据库

HistoricalData

我有另一个名为Id的表,其中包含以下列: StatusCommentsDateConversions

我希望能够插入Id表,选择刚从插入中自动创建的Id,并在HistoricalData的第二个插入中使用1! = 1 2! = 2 3! = 6 4! = 24 . . . 10! = 3628800 . . 100! = 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 BigInteger 1}}表。我可以用某种SQL魔法来做到这一点吗?

2 个答案:

答案 0 :(得分:1)

您可以使用OUTPUT子句直接插入第二个表。您的SQL将类似于:

INSERT Conversions (CID, Source, Destination, Packages, CreatedBy, SourceID)
OUTPUT inserted.ID, @Status, @Comments, GETDATE()
    INTO HistoricalData (ID, Status, Comments, Date)
VALUES (@CID, @Source, @Destination, @Packages, @CreatedBy, @SourceID);

但是,如果两个表之间存在外键关系,则无效。在某些情况下,我建议在插入子表之前简单地使用output子句插入临时表,但由于您只插入一行并且只访问身份字段,因此您可以使用SCOPE_IDENTITY()

INSERT Conversions (CID, Source, Destination, Packages, CreatedBy, SourceID)
VALUES (@CID, @Source, @Destination, @Packages, @CreatedBy, @SourceID); 

INSERT HistoricalData (ID, Status, Comments, Date)
VALUES (SCOPE_IDENTITY(), @Status, @Comments, GETDATE());

N.B。在这两种情况下,我都不确定您要添加为StatusCommentDate的内容,因此使用变量和GETDATE(),您可能需要调整此项

另一个注意事项,我已经从SELECT没有FROM切换到插入的VALUES构造函数,在重写查询时大多数情况下是第二种性质。这两种方法没有区别,虽然我发现使用VALUES显示更好的意图,但它显示没有选择任何内容。

答案 1 :(得分:1)

如果您的数据库支持存储过程,我肯定会这样做。使用所需参数创建存储过程。像这样创建你的SqlCommand:

SqlCommand command = new SqlCommand("MyStoredProcedureName", connect);
command.CommandType=CommandType.StoredProcedure;

像在当前代码中一样传递参数。 您的数据库存储过程如下所示:

CREATE PROCEDURE MyStoredProcedureName 
@CID bigint,
..... all params
    AS
    BEGIN
   DECLARE @myNewID bigint
SET NOCOUNT ON;

        Insert Into Conversions (CID, Source, Destination, Packages, CreatedBy, SourceID) VALUES (@CID, @Source, @Destination, @Packages, @CreatedBy, @SourceID)
    SET @myNewID=SCOPE_IDENTITY()
    -- Now you can insert what you want where you want
    INSERT INTO  HistoricalData (Column list...) (Values list ... @myNewID)
    END

如果您没有使用Entity Framework或类似的东西,最好将数据库代码与其余代码分开。因此,当您更改表名/列名或数据库结构的任何更改时,您不必更改代码。只需更改数据库部分和存储过程即可。