Вставить в выберите с определенными значениями столбцов

#sql-server

#sql-сервер

Вопрос:

Итак, мне было интересно, есть ли что-то подобное:

 insert into Table_History select *, CreationUser=getUser() from deleted;
 

где я перезаписываю / устанавливаю значение только одного столбца звездочек без необходимости выписывать все столбцы и заменять CreationUser на getUser() .

Я не хочу записывать каждый столбец таким образом:

 insert into Table_History select Id, Name, getUser() from deleted;
 

или мне нужно просто обновить значение после вставки?

Редактировать: причина этого не в том, что я слишком ленив, чтобы выводить столбцы, а в том, что это внутри триггера. И я не хочу редактировать триггер для добавления строк во вставку каждый раз, когда я изменяю таблицу. Но лучше обновить только две таблицы и не беспокоиться о триггере.

Комментарии:

1. * возвращает все столбцы в наборе данных (или objectname.* все столбцы для объекта). Нет * {replace column with this} или * {except this column} . Вам нужно определить нужные столбцы SELECT . Если вы действительно не хотите вводить их, подумайте о покупке инструмента надстройки, который предлагает функциональность для расширения * в соответствующие имена столбцов.

2. Не проще ли просто добавить новый столбец ModificationUser в Table_History, чтобы вы могли заполнить его всеми столбцами, удаленными, плюс getUser() ?

3. @MarcGuillot да, наверное. Я хотел, я думаю, повторно использовать столбец, поскольку я действительно не использую столбец в таблице истории. Поскольку исходный пользователь создания все равно будет находиться в обычной таблице. И изменение пользователя создания показалось мне правильным, поскольку строка была создана из-за пользователя, который изменил строку, а не обязательно пользователя, который создал исходную строку.

4. каждый раз, когда я изменяю таблицу , но вы не должны последовательно менять схему в первую очередь.

5. @SMor вы правы, но разве я не должен стараться сделать это как можно более простым на случай, если что-то будет добавлено. Потому что, если кто-то просто добавит его и никогда не поймет, что им также нужно отредактировать триггер. Да, я думаю, это было бы ошибкой с их стороны, но что, если я могу просто написать триггер «настолько хороший», что эта ошибка может просто никогда не произойти.

Ответ №1:

Выделите имя таблицы. Нажмите Alt F1, чтобы отобразить сведения о таблице. Там вы можете щелкнуть заголовок столбца Column_name во втором поле, скопировать имена столбцов и вставить их в свой запрос, чтобы не вводить имя каждого столбца. Просто нужно добавить запятые в этот момент.

введите описание изображения здесь

Комментарии:

1. Спасибо за ответ :)! Не то, что я хотел, но я обновил вопрос, чтобы сделать его более понятным. Тем не менее, спасибо за ответ. Я собираюсь использовать это в следующий раз, так как это все еще отличный совет: P!

Ответ №2:

Для того, что вы пытаетесь сделать, нет «простых» ярлыков.

Причины:

  1. SQL Server не имеет функциональности для позиционных ссылок на столбцы.
  2. Как сказал @Larnu, нет «Нет * {replace column with this} или * {except this column} «.
  3. Столбец CreatedBy не всегда будет последним, так как при добавлении столбцов в таблицы они будут добавлены в последнюю позицию, если вы не принудительно установите определенную позицию путем повторного создания таблицы.

Решения:

  1. Обновление после вставки — как вы уже упоминали.
  2. Используйте временную таблицу / табличную переменную для временного хранения данных и их обновления перед записью в таблицу истории.

Выбор зависит от того, сколько строк обычно обновляется (обновляется / вставляется) за один раз и насколько велика таблица истории. Небольшие пакеты с добавлением — используйте табличную переменную. Для очень больших пакетов табличные переменные, вероятно, снизят производительность, поскольку вы будете копировать много данных.