При исследовании способов оптимизации массовых обновлений SQL Server я обнаружил следующий запрос, который работает правильно, но мне сложно понять, как работает нотация «...» в следующем фрагменте кода C#:
command.CommandText = "CREATE TABLE #TmpTable(...)";
command.ExecuteNonQuery();
command.CommandText = "UPDATE T SET ... FROM " + tableName + " T INNER JOIN #TmpTable Temp ON ...; DROP TABLE #TmpTable;"
command.ExecuteNonQuery();
Это означает, что вам нужно добавить код. Например, в вашем случае для первого «...» вы должны добавить что-то вроде этого -> «CREATE TABLE #TmpTable (ID int not null)». Вам необходимо определить свои поля.
Этот код был размещен в stackoverflow.com/questions/20635796/bulk-update-in-c-sharp, и я реализовал и протестировал его в приложении C#. У меня вопрос, почему это работает?
Если посмотреть на код в вопросе, который вы связали, запрос выполняется в блоке try...catch, а любые возникшие исключения игнорируются. Если вы перейдете (или добавите throw; в блок catch), я полагаю, вы увидите выброшенное исключение.
Спасибо за ваш отзыв, Diado, однако, значения, которые я вставил в #TmpTable, корректно обновляются в таблице tableName, и любые исключения будут зарегистрированы в моем тестовом коде.
Я склонен сказать, что какой-то другой код обновляет вашу таблицу, поскольку CREATE TABLE #Test1 (test1 VARCHAR(1)); CREATE TABLE #TmpTable (test2 VARCHAR(1)); UPDATE T SET ... FROM #Test1 T INNER JOIN #TmpTable Temp ON ...; не анализирует в SSMS (в частности, оператор UPDATE выдает Incorrect syntax near the keyword 'FROM'.).
Я бы хотел, чтобы SqlFiddle не был сломан прямо сейчас :-(
Привет, Диадо, в моем коде была ошибка, и вместо обновления TmpTable напрямую обновлялось «tableName». Я ошибочно предположил, что многоточие творит какое-то волшебство. Я до сих пор не уверен, почему в этом случае не было сгенерировано исключение SQL. Похоже, что в указанном примере в качестве заполнителя использовалось "...". Правильный код должен был выглядеть так: command.CommandText = "UPDATE T SET x = Temp.x FROM" + tableName + "T INNER JOIN #TmpTable Temp ON T.Id = Temp.Id; COMMIT; DROP TABLE #TmpTable; COMMIT;" ;
Голосуя за закрытие, проблема, похоже, в том, что OP буквально набрал «...», где в примере, который он копировал, имелось в виду «ваш код здесь».





В коде была ошибка, так что целевая таблица обновлялась напрямую, а не сначала записывалась во временную таблицу. В указанном коде в качестве заполнителя использовалось многоточие (...), но по какой-то причине мой код не смог сгенерировать исключение там, где это должно было произойти. Исправленный фрагмент должен выглядеть следующим образом:
command.CommandText = "CREATE TABLE #TmpTable(Id int, x int)";
command.ExecuteNonQuery();
// Insert updated rows read from 'tableName' into #TmpTable
command.CommandText = "UPDATE T SET T.x = Temp.x FROM " + tableName + " T INNER JOIN #TmpTable Temp ON T.Id = Temp.Id; DROP TABLE #TmpTable;"
command.ExecuteNonQuery();
Как узнать, что он работает правильно?