T-SQL ... Обозначение

При исследовании способов оптимизации массовых обновлений 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();

Как узнать, что он работает правильно?

Lasse V. Karlsen 19.10.2018 12:15

Это означает, что вам нужно добавить код. Например, в вашем случае для первого «...» вы должны добавить что-то вроде этого -> «CREATE TABLE #TmpTable (ID int not null)». Вам необходимо определить свои поля.

M. Mohabbati 19.10.2018 12:16

Этот код был размещен в stackoverflow.com/questions/20635796/bulk-update-in-c-sharp, и я реализовал и протестировал его в приложении C#. У меня вопрос, почему это работает?

nkift 19.10.2018 12:27

Если посмотреть на код в вопросе, который вы связали, запрос выполняется в блоке try...catch, а любые возникшие исключения игнорируются. Если вы перейдете (или добавите throw; в блок catch), я полагаю, вы увидите выброшенное исключение.

Diado 19.10.2018 12:38

Спасибо за ваш отзыв, Diado, однако, значения, которые я вставил в #TmpTable, корректно обновляются в таблице tableName, и любые исключения будут зарегистрированы в моем тестовом коде.

nkift 19.10.2018 12:45

Я склонен сказать, что какой-то другой код обновляет вашу таблицу, поскольку 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'.).

Diado 19.10.2018 12:52

Я бы хотел, чтобы SqlFiddle не был сломан прямо сейчас :-(

Diado 19.10.2018 12:53

Привет, Диадо, в моем коде была ошибка, и вместо обновления 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;" ;

nkift 19.10.2018 13:39

Голосуя за закрытие, проблема, похоже, в том, что OP буквально набрал «...», где в примере, который он копировал, имелось в виду «ваш код здесь».

DaveyDaveDave 19.10.2018 14:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
107
1

Ответы 1

В коде была ошибка, так что целевая таблица обновлялась напрямую, а не сначала записывалась во временную таблицу. В указанном коде в качестве заполнителя использовалось многоточие (...), но по какой-то причине мой код не смог сгенерировать исключение там, где это должно было произойти. Исправленный фрагмент должен выглядеть следующим образом:

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();

Другие вопросы по теме