抱歉标题不好,我还没想出更好的标题。
我目前正在优化一种基本上可以进行数千次选择和插入的工具。
假设以下关系
class A
{
public long ID; // This is an automatic key by the sqlserver
...Some other values
}
class B
{
public long RefID // Reference to A.ID;
... some other values...
}
class C
{
public long RefID // Reference to A.ID;
... some other values
}
目前正在发生的是获取ObjectA的SELECT, 如果它不存在,请创建一个新的。 Query返回ID(OUTPUT INSERTED.ID)
然后选择(如果不存在则插入)对象B和C.
有没有办法将其压缩为单个SQL语句?
我在自动生成对象A的部分挣扎。
所以它必须做这样的事情:
IF NOT EXISTS(SELECT * FROM TableA WHERE someConditions)
INSERT... and get the ID
ELSE
REMEMBER THE ID?
IF NOT EXISTS(SELECT * FROM TableB WERE RefID = ourRememberedID)
INSERT...
IF NOT EXISTS(SELECT * FROM TableC WERE RefID = ourRememberedID)
INSERT...
请注意,不能使用存储过程。
答案 0 :(得分:0)
一点帮助 您可以在一个声明中发出这三个 使用DataReader NextResult
select ID from FROM TableA WHERE someConditions
select count(*) from TableB where refID = (select ID from FROM TableA WHERE someConditions)
select count(*) from TableC where refID = (select ID from FROM TableA WHERE someConditions)
但是即便如此,你还是冒了一个风险,TableB或TableC在你到达之前有一个插入
如果我无法使用存储过程,我想我会使用TVP将数据加载到#temp中 我认为你可以在交易中制作4个陈述