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