2013-11-15 39 views
0

我正在建立一個通用的參數化查詢(插入或更新),我使用插入的列(在INSERT查詢中)參數和更新的列和where子句列(在UPDATE查詢中)的參數。SQL參數化查詢中可能有多個OUTPUT關鍵字嗎?

在這兩種情況下,我還允許指定一個列名,這是由我的方法返回的,並且要使用OUTPUT INSERTED.ColumnName來完成該操作。此列可能是表格的主鍵,但也可能是其他內容。

現在,在執行INSERT或UPDATE之後,我想獲取剛剛插入或更新的行的密鑰。我怎樣才能做到這一點?我可以做些什麼嗎?OUTPUT INSERTED.ColumnName, SCOPE_IDENTITY()

注意:這不是一個存儲過程,以防萬一。

+2

你能告訴我們一些代碼? aaaaaand btw,你見過實體框架嗎? – Misters

+0

'SCOPE_IDENTITY()'返回一個表示當前作用域中插入的最後一個標識值的值。我不認爲在可以處理多行的'OUTPUT'子句以及底層表甚至沒有IDENTITY列的情況下它是有意義的。 – HABO

+0

您不能有多個'OUTPUT'關鍵字,但是您可以輸出多個**列**,例如'OUTPUT Inserted.ColumnName,Inserted.ID'等。 –

回答

1

當然可以。它看起來有點像這樣:

DECLARE @result TABLE (
    ID INT, 
    SomeColumn NVARCHAR(100) 
) 

INSERT SomeTable (SomeColumn) 
OUTPUT SCOPE_IDENTITY(), INSERTED.SomeColumn 
INTO @result 
VALUES ('Foo'), 
     ('Bar') 

SELECT * FROM @result 

這將輸出:

ID | SomeColumn 
--------------- 
1 | 'Foo' 
2 | 'Bar' 
+0

您的語法看起來不同,是一個存儲過程嗎?我在C#中使用參數化查詢,目前使用'command.ExecuteScalar()'。這仍然可以輸出2個值嗎?或者我將不得不使用'ExecuteReader()'? – user2320724

+0

@ user2320724這不是一個存儲過程,但是你將不能使用ExecuteScalar,因爲它只會返回一個值。你必須使用'ExecuteReader'。 –

+0

如果表格中沒有觸發器,則可以跳過表格變量,選擇和選擇子句。只要執行INSERT ... OUTPUT inserted.Id,inserted.SomeColumn VALUES ...' – adrianm