T-SQL Вставка в таблицу без указания каждого столбца

В нашем db есть таблица с чуть более 80 столбцами. Он имеет первичный ключ, а вставку Identity включен. Я ищу способ вставить в эту таблицу каждый столбец EXCEPT столбца первичного ключа из идентичной таблицы в другой БД.

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

Ответы

Ответ 1

Вы можете сделать это довольно легко:

-- Select everything into temp table
Select * Into 
    #tmpBigTable
    From [YourBigTable]

-- Drop the Primary Key Column from the temp table  
Alter Table #tmpBigTable Drop Column [PrimaryKeyColumn]

-- Insert that into your other big table
Insert Into [YourOtherBigTable]
    Select * From #tmpBigTable

-- Drop the temp table you created
Drop Table #tmpBigTable

Если у вас есть Identity Insert On в "YourOtherBigTable", а столбцы абсолютно идентичны, вы будете в порядке.

Ответ 2

Вы можете запросить Information_Schema, чтобы получить список всех столбцов и программно генерировать имена столбцов для вашего запроса. Если вы все это делаете в t-sql, это будет громоздко, но это можно сделать. Если вы используете какой-либо другой язык клиента, например С# для выполнения операции, это будет немного менее громоздким.

Ответ 3

Нет, это невозможно. У вас может возникнуть соблазн использовать

INSERT INTO MyLargeTable SELECT * FROM OtherTable

Но это не сработает, потому что ваш столбец идентичности будет включен в *.

Вы можете использовать

SET IDENTITY_INSERT MyLargeTable ON
INSERT INTO MyLargeTable SELECT * FROM OtherTable
SET IDENTITY_INSERT MyLargeTable OFF

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

Но это не сработает. В этом случае сервер SQL не примет значение *. Вы должны явно указать Id в script, например:

SET IDENTITY_INSERT MyLargeTable ON
INSERT INTO MyLargeTable (Id, co1, col2, ...., col80) SELECT Id, co1, col2, ...., col80 FROM OtherTable
SET IDENTITY_INSERT MyLargeTable OFF

Итак, мы вернулись с того места, где мы начали.

Самый простой способ - щелкнуть правой кнопкой мыши по таблице в Management Studio, позволить ей генерировать сценарии INSERT и SELECT и немного редактировать их, чтобы они работали вместе.

Ответ 4

CREATE TABLE Tests
(
    TestID int IDENTITY PRIMARY KEY,
    A int,
    B int,
    C int
)

INSERT INTO dbo.Tests
VALUES (1,2,3)

SELECT * FROM Tests

Это работает в SQL2012

Ответ 5

Почему бы просто не создать ПРОСМОТР исходных данных, удалив ненужные поля? Затем "Выберите * в" желание ваших сердец.

  • Локализованное управление в одном представлении
  • Не нужно изменять SPROC
  • Добавить/изменить/удалить поля легко
  • Не нужно запрашивать метаданные
  • Нет временных таблиц

Ответ 6

На самом деле, честно говоря, требуется десять секунд или меньше, чтобы вытащить все столбцы из браузера объектов, а затем удалить столбец идентификаторов из списка. Плохая идея использовать select * для чего угодно, кроме быстрого запроса ad hoc.

Ответ 7

В ответ на соответствующий вопрос (SELECT * EXCEPT), я указываю действительно реляционный язык Tutorial D позволяет проецировать проекцию в терминах атрибутов, подлежащих удалению, вместо тех, которые нужно сохранить, например

my_relvar { ALL BUT description }

Однако его синтаксис INSERT требует, чтобы конструкторы значений кортежа включали пары имени/значения атрибута, например.

INSERT P
   RELATION 
   {
      TUPLE { PNO PNO ( 'P1' ) , PNAME CHARACTER ( 'Nut' ) }, 
      TUPLE { PNO PNO ( 'P2' ) , PNAME CHARACTER ( 'Bolt' ) }
   };

Конечно, используя этот синтаксис, нет упорядочения столбцов (потому что он действительно реляционный!), например. это семантически эквивалентно:

INSERT P
   RELATION 
   {
      TUPLE { PNO PNO ( 'P1' ) , PNAME CHARACTER ( 'Nut' ) }, 
      TUPLE { PNAME CHARACTER ( 'Bolt' ) , PNO PNO ( 'P2' ) }
   };

Альтернативой было бы полностью полагаться на упорядочение атрибутов, что SQL делает частично, например. это близкий SQL, эквивалентный приведенному выше:

INSERT INTO P ( PNO , PNAME ) 
   VALUES        
      ( PNO ( 'P1' ) , CAST ( 'Nut'  AS VARCHAR ( 20 ) ) ) , 
      ( PNO ( 'P2' ) , CAST ( 'Bolt' AS VARCHAR ( 20 ) ) );

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