2014-01-16 58 views
0

對不起,我還沒有拿出一個更好的一個呢。插入多個基於對方的值的記錄

我目前正在優化一個基本上可以完成數千個選擇和插入的工具。

假設下面的關係

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 
} 

目前正在發生什麼是一個選擇,以獲得對象A, 如果它不存在,創建一個新的。該查詢返回

然後選擇(插入如果不是existant)的對象ID(OUTPUT INSERTED.ID)B和C.

是否有辦法來壓縮成一個單一的SQL語句呢?

Im在自動生成對象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

不幸的是,在這種環境下,存儲過程是沒有選擇的... – CSharpie

+0

存儲過程不是一個選項嗎? 2014年? –

回答

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) 

但即使如此,你承擔風險的表B或表C有一個插入你得到它之前

如果我不能使用存儲過程,我想我會使用TVP將數據加載到#temp中
我認爲您可以在事務中創建4條語句

+0

現在我這樣做,節省了2/3的時間 – CSharpie

相關問題