我有一個表的標識列,其值希望在INSERT後得到。下面的代碼,不使用參數,是可以正常使用:SCOPE_IDENTITY似乎不適用於參數化查詢
string query = "INSERT INTO aTable ([aColumn]) VALUES (42)";
SqlCommand command = new SqlCommand(query, connection);
command.ExecuteNonQuery();
query = "SELECT CAST(SCOPE_IDENTITY() AS bigint)";
command = new SqlCommand(query, connection);
object identity = command.ExecuteScalar();
如果我改變了上面的代碼的INSERT部分使用參數化查詢,ExecuteScalar()
突然返回System.DBNull
值。這是參數化查詢代碼的樣子:
string query = "INSERT INTO aTable ([aColumn]) VALUES (@aColumn)";
SqlCommand command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@aColumn", 42);
command.ExecuteNonQuery();
我曾嘗試,以便它使用的輸出參數,並調用ExecuteNonQuery()
改變SCOPE_IDENTITY代碼,但是我還是在輸出參數爲空值。我也試着針對兩個不同版本的SQL Server(2012和2008,都是Express Edition)運行代碼,結果也一樣。
任何想法,我做錯了什麼?
參數化的查詢可能拉閘調用'sp_executesql'。它在子範圍內運行,當它退出時,SCOPE_IDENTITY()在外部範圍內爲空。 –
除了將它們組合到一個批處理中之外,另一個解決方法是停止在應用程序中嵌入動態SQL,並將此邏輯放入存儲過程中。 –
你也可以嘗試'INSERT INTO aTable(...)OUTPUT Inserted.ID VALUES(.....)'來自動輸出所有插入的新ID值。 –