关于SQL插入语句的问题

本文关键字:问题 语句 插入 SQL 关于 | 更新日期: 2023-09-27 17:58:01

我有两个表:

Threads
*******
ThreadID
UserID
TopicsID
Date
ThreadTitle
ThreadParagraph
ThreadClosed
Topics
******
TopicID
Theme
Topics
Date

我需要插入两个语句并将它们连接起来!这是第一次陈述:

string insertCommand = 
    "INSERT INTO Users (UserID,TopicID,Date,ThreadTitle,ThreadParagraph) " +
     "VALUES ('CONVERT(uniqueidentifier, '" + giveMeGuidID() + 
     "),TopicID,dateTime,questionTitle,subTopic)";

我需要为主题表提供另一个声明:

string insertCommand = 
    "INSERT INTO Topics (UserID,TopicID,Date,ThreadTitle,ThreadParagraph) " +
    "VALUES ('Theme, Topics, Date')";

问题是我在TopicsID(线程表)和TopicsIID之间有一个连接(主题表)。两者都是增量int,那么我如何将相同的TopicID插入他们两个都得到了相同的价值?

关于SQL插入语句的问题

如果使用MS SQL server,则可以使用@@Identity获取自动增量值。

string insertCommand = 
    "INSERT INTO Users (UserID,TopicID,Date,ThreadTitle,ThreadParagraph) " +
    "VALUES ('CONVERT(uniqueidentifier, '" + giveMeGuidID() +
    "),TopicID,dateTime,questionTitle,subTopic); SELECT @@Identity";

然后,以ExecuteScalar的身份运行此命令,并获得值

您可以通过使用TransactionScope和使用SCOPE_IDENTITY()来维护Transaction,以从First Query中获取插入的Id。

 // Create the TransactionScope
using (TransactionScope oTranScope = new TransactionScope())
{
   Int32 TopicID;
    // Open a connection 
    using (SqlConnection oCn1 = new SqlConnection(this.sCn1))
    {
        SqlCommand oCmd1 = new SqlCommand("INSERT INTO Users (UserID,TopicID,Date,ThreadTitle,ThreadParagraph) " +
"VALUES ('CONVERT(uniqueidentifier, '" + giveMeGuidID() +
"),TopicID,dateTime,questionTitle,subTopic); SELECT SCOPE_IDENTITY()";, oCn1);
        oCmd1.Parameters.Add ... Better to use parameter to save SQL Injection Attack
        oCn1.Open();
        // At this point, the connection is in the transaction scope, 
        // which is a lightweight transaction.
        TopicID = Convert.ToInt32 oCmd1.ExecuteScaler()); // as you want to get Id
        oCn1.Close();
    }
    // Open a connection 
    using (SqlConnection oCn2 = new SqlConnection(this.sCn2))
    {
        SqlCommand oCmd2 = new SqlCommand("SQLQuery", oCn2);
        //use return TopicID from last inserted query
        oCn2.Open();
        // The connection is enlisted in the transaction scope, 
        // which is now promoted to a distributed transaction
        // controlled by MSDTC
        oCmd2.ExecuteNonQuery();
        oCn2.Close();
    }
    // Tell the transaction scope to commit when ready 
    oTranScope.Consistent = true;
    // The following bracket completes and disposes the transaction
}

如果您正在寻找可靠的东西,您需要使用事务

请参阅管理SQL Server存储过程中的事务以获得想法。

另外,请看一下控制事务(数据库引擎)和SQL Server事务隔离模型。

您还需要使用@@Identity作为最后插入的标识值。

您的代码示例与所提供的其余信息没有很好的相关性。不过,如果没有代码,你的帖子似乎足够一致,所以我倾向于认为这些片段只是错误的。

不管怎样,你的想法似乎很清楚。在SQLServer2005+中,您可以使用类似以下的INSERT语句来解决问题:

string insertCommand = 
    "INSERT INTO Topics (Theme, Topics, Date) " +
      "OUTPUT 'CONVERT(uniqueidentifier, '" + giveMeGuidID() +
      "'), INSERTED.TopicID, @dateTime, @questionTitle, @subTopic " +
      "INTO Threads (UserID, TopicID, Date, ThreadTitle, ThreadParagraph) " +
    "VALUES (@Theme, @Topics, @Date)";

尽管这是一个单独的语句,但它会在不同的表中执行两次插入。正在向Topics表中插入"main"。Threads中的"secondary"由OUTPUT...INTO子句定义。基本上,OUTPUT子句允许您引用正在插入的数据,并将它们作为行集返回给客户端,或者(与INTO结合使用时)将它们引导到现有表中,就像您在这里看到的那样。