Как я могу кратко скопировать несколько строк SQL с небольшими изменениями? - PullRequest
1 голос
/ 20 апреля 2010

Я копирую подмножество некоторых данных, так что в будущем копия будет изменяться независимо.

Один из моих операторов SQL выглядит примерно так (я изменил имена таблиц и столбцов):

INSERT Product(
  ProductRangeID,
  Name, Weight, Price, Color, And, So, On
)
SELECT
  @newrangeid AS ProductRangeID,
  Name, Weight, Price, Color, And, So, On
FROM Product
WHERE ProductRangeID = @oldrangeid and Color = 'Blue'

То есть мы запускаем новую линейку продуктов, которая изначально состоит из всех синих элементов в некотором указанном текущем диапазоне, под новыми SKU. В будущем мы можем менять версии продуктов «синего диапазона» независимо от старых.

Я довольно новичок в SQL: что-нибудь умное я должен сделать, чтобы избежать перечисления всех этих столбцов, или, по крайней мере, избегать перечисления их дважды? Я могу жить с текущим кодом, но я бы предпочел не возвращаться и не изменять его, если в Product добавляются новые столбцы. В его нынешнем виде он просто молча не сможет скопировать новый столбец, если я забуду это сделать, что должно появиться в тестировании, но не очень.

Я копирую каждый столбец, кроме ProductRangeID (который я изменяю), ProductID (увеличивающий первичный ключ) и двух столбцов DateCreated и timestamp (которые принимают автоматически созданные значения для новой строки).

Кстати, я подозреваю, что у меня должна быть отдельная таблица соединения между ProductID и ProductRangeID. Я не определил таблицы.

Это хранимая процедура T-SQL в SQL Server 2008, если это имеет какое-либо значение.

Ответы [ 2 ]

1 голос
/ 20 апреля 2010

Вы можете опустить имена полей для целевой таблицы, но, как правило, не следует.

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

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

1 голос
/ 20 апреля 2010

В SELECT можно либо использовать *, либо перечислить все столбцы и выражения явно, частичных подстановочных знаков нет.

Возможно, вы можете сделать SELECT * во временной таблице или табличной переменной, за которой следует UPDATE этой таблицы, если это всего лишь разовый запрос и производительность не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...