Я использую следующий шаблон для работы с SQL серверными временными таблицами из. NET приложений:
- Открыть соединение
- Создать временную таблицу (только c команда !!!)
- Записать в него много данных через SqlBulkCopy
- Выполнить выбор / обновление с присоединением к этой временной таблице (этот запрос уже можно параметризовать)
- Закройте соединение
Using cn As New SqlConnection("Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;") : cn.Open()
Using cm As New SqlCommand("create table #T1(C1 int primary key, C2 int)", cn)
cm.ExecuteNonQuery()
End Using
Using bk As New SqlBulkCopy(cn)
bk.DestinationTableName = "#T1"
bk.WriteToServer(dataToWrite)
End Using
Using cm As New SqlCommand("update a set a.C2=b.C2 from SomeTable a join #T1 b on a.C1=b.C1 where a.C3=@PC3", cn)
cm.Parameters.Add("C2", SqlDbType.Int).Value = c3Value
cm.ExecuteNonQuery()
End Using
End Using
К сожалению, я не могу явно повлиять на то, будет ли выполняться команда «create temp table» как ad-ho c.
Хотя исходный код SqlCommand
описывает это поведение в комментариях ( // Отправить более SQL пакетную команду, если мы не сохраняем pro c и не имеем параметров ), но в документация.
Теоретически поведение SqlCommand
в будущем. NET версии могут быть изменены, так что «создать таблицу #T ...» будет упаковано в sp_executesql
. Использование временных таблиц из кода. NET станет невозможным, и приложение перестанет работать.
Правильно ли я понимаю проблему?
Могу ли я быть уверен, что в будущих версиях. NET по-прежнему не будет упаковывать запросы без параметров в sp_executesql
?