#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:
Для того, что вы пытаетесь сделать, нет «простых» ярлыков.
Причины:
- SQL Server не имеет функциональности для позиционных ссылок на столбцы.
- Как сказал @Larnu, нет «Нет
* {replace column with this}
или* {except this column}
«. - Столбец CreatedBy не всегда будет последним, так как при добавлении столбцов в таблицы они будут добавлены в последнюю позицию, если вы не принудительно установите определенную позицию путем повторного создания таблицы.
Решения:
- Обновление после вставки — как вы уже упоминали.
- Используйте временную таблицу / табличную переменную для временного хранения данных и их обновления перед записью в таблицу истории.
Выбор зависит от того, сколько строк обычно обновляется (обновляется / вставляется) за один раз и насколько велика таблица истории. Небольшие пакеты с добавлением — используйте табличную переменную. Для очень больших пакетов табличные переменные, вероятно, снизят производительность, поскольку вы будете копировать много данных.