ВЫБЕРИТЕ * (отдельно от идентификатора) ИЗ

#sql-server-2005 #duplicate-data

#sql-server-2005 #дублировать-данные

Вопрос:

У меня есть таблица примерно с 20 столбцами, и я хочу дублировать запись. Я мог бы просто сделать:

 INSERT INTO [Table] (ColumnA, ColumnB, ColumnC, .... ColumnZ)
SELECT TOP 1 ColumnA, ColumnB, ColumnC, .... ColumnZ
FROM [Table]
WHERE ID=@ID
  

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

 INSERT INTO [Table]
SELECT TOP 1 * (apart from identity)
FROM [Table]
WHERE ID=@ID
  

Возможно ли это?

Ответ №1:

SQL Server не предоставляет никаких функциональных возможностей «выбрать *, кроме идентификатора», вам пришлось бы написать это самостоятельно, указав каждый столбец. Если определения столбцов таблицы будут меняться со временем (добавлять, переименовывать или удалять столбцы), то единственный способ сделать это — использовать динамический код, создающий инструкцию insert на основе содержимого sys.columns для object_kd = object_id(‘YourTable’), исключая столбец identity, если таковой присутствует. За мои деньги, если вы добавляете столбцы, вам лучше просмотреть и обновить код, который ссылается на эту таблицу.

О, и если ID является первичным ключом, то top 1 в этом нет необходимости.

Ответ №2:

Один из способов, но он захватит все столбцы

 SELECT TOP 1 * 
INTO [NewTable]
FROM [Table]
WHERE ID=@ID
  

другой вариант — динамический SQL, создайте список столбцов из information_schema.columns , пропустите столбец с идентификатором, а затем выполните динамический sql