Временные таблицы через SqlCommand из приложения. NET - PullRequest
1 голос
/ 17 июня 2020

Я использую следующий шаблон для работы с SQL серверными временными таблицами из. NET приложений:

  1. Открыть соединение
  2. Создать временную таблицу (только c команда !!!)
  3. Записать в него много данных через SqlBulkCopy
  4. Выполнить выбор / обновление с присоединением к этой временной таблице (этот запрос уже можно параметризовать)
  5. Закройте соединение
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?

...