Как я могу скопировать все поля одной таблицы в другую, более широкую таблицу в SQL Server 2005 Express? - PullRequest
1 голос
/ 01 февраля 2010

Я знаю, что мой заголовок не совсем правильно сформулирован, поэтому позвольте мне уточнить. Я использую SQL Server 2005 Express.

У меня есть таблица, в которой хранится "шаблон", если хотите. Используя автомобиль в качестве примера, поля будут выглядеть примерно так:

TemplateID
Color
Make
Model

Теперь у меня есть другая таблица, которая представляет «экземпляр» шаблона. Он содержит все поля таблицы шаблонов, а также некоторые поля, уникальные для экземпляра:

InstanceID
VIN
SerialNumber
Color
Make
Model

Я пишу хранимую процедуру для вставки новой строки в таблицу «Экземпляр». Эта хранимая процедура будет принимать входные параметры для «VIN» и «SerialNumber», но я хочу, чтобы она скопировала «Color», «Make» и «Model» из соответствующего «Template». Шаблон находится по «TemplateID», который уже известен.

Я ищу совет о том, как написать эту хранимую процедуру. Было бы просто, если бы не тот факт, что эти таблицы содержат более 100 полей (я их не проектировал, но я застрял, используя их). Я хотел бы сделать что-то вроде:

INSERT INTO Instance(VIN, SerialNumber, "EverythingElse") 
VALUES (@VIN, @SerialNumber, SELECT * FROM Template WHERE TemplateID = 1)

Другими словами, я хочу предоставить (через параметры) только те поля, которые не хранятся в «Шаблоне», и скопировать все остальное из шаблона. Возможно ли что-нибудь подобное без ручного кодирования для каждого поля?

Ответы [ 2 ]

1 голос
/ 01 февраля 2010

Тогда вы можете использовать динамический SQL следующим образом ...

DECLARE
    @Fields nvarchar(Max),
    @SQL nvarchar(Max);

SELECT
    @Fields = COALESCE(@Fields + ',', '') + column_name
FROM
    information_schema.columns
WHERE
    table_schema = 'dbo' AND
    table_name = 'Instance' AND
    column_name <> 'PrimaryKeyID' --here you exclude columns
ORDER BY
    ordinal_position;


SET @SQL = 'INSERT INTO dbo.Instance' 
    + ' ('
    + @Fields
    + ') SELECT '
    + ' ('
    + @Fields
    + ') FROM Template;'            

EXECUTE sp_executesql @SQL;
0 голосов
/ 01 февраля 2010

Просто сделайте INSERT INTO и используйте оператор SELECT вместо оператора значений.

INSERT INTO Instance(VIN, SerialNumber, a, b, c) 
SELECT @VIN, @SerialNumber, a, b, c FROM Template WHERE TemplateID = 1;

Вы действительно не хотите использовать *. У вас может быть сценарий SQL Server Managemnt Studio для оператора SELECT, и он будет генерировать имена полей, поэтому вам не придется их вводить.

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