关于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插入他们两个都得到了相同的价值?
如果使用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
结合使用时)将它们引导到现有表中,就像您在这里看到的那样。