T-SQL Вставить в таблицу без указания каждого столбца - PullRequest
21 голосов
/ 06 марта 2012

В нашей базе данных есть таблица, которая имеет чуть более 80 столбцов.Он имеет первичный ключ, и вставка идентификатора включена.Я ищу способ вставить в эту таблицу каждый столбец ИСКЛЮЧИТЬ столбец первичного ключа из идентичной таблицы в другой БД.

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

Ответы [ 7 ]

50 голосов
/ 06 марта 2012

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

-- 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

При условии, что в "YourOtherBigTable" включена вставка идентификатора, а столбцы абсолютно идентичны, с вами все будет в порядке.

3 голосов
/ 08 октября 2013
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

2 голосов
/ 06 марта 2012

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

INSERT INTO MyLargeTable SELECT * FROM OtherTable

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

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

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

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

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

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 и немного отредактировать их, чтобы они могли работать вместе.

2 голосов
/ 06 марта 2012

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

1 голос
/ 15 октября 2014

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

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

Отвечая на связанный вопрос ( SELECT * EXCEPT ), я указываю на действительно реляционный язык Учебное пособие 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 сохраняют этот порядок, что не является идеальным.Но, по крайней мере, порядок указан: ваше предложение будет опираться на некоторый порядок по умолчанию, который может быть недетерминированным.

0 голосов
/ 06 марта 2012

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

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