2017-02-07 2 views
1

Я знаю, как вставлять, выбирая из другой таблицы, но моя проблема немного сложна. У меня есть таблицы, как показано ниже.SQL Server: вставить в таблицу, выбрав из другой таблицы

Таблица 1:

Col1 | Col2 | Col3 | ..... | Col20 

Таблица 2:

Col1 | Col2 | Col3 | ..... | Col20 

Обе таблицы идентичны. То, что я хочу сделать, это вставить все значения из таблицы 1 в таблицу 2, но оставить один столбец (скажем, Col20). Я хочу вставить этот столбец с моим пользовательским значением. Я могу сделать это, сопоставляя 1 к 1 столбцу, как показано ниже.

Insert into table1(Col1, Col2, ..., Col20) 
    select Col1, Col2, ..., @customvalue 
    from table2 

Я пошел бы с этим способом, но я должен использовать этот запрос несколько раз внутри хранимых процедур, которые делают, что хранимая процедура длительная. Но я хочу сократить этот запрос. Есть ли другой, лучший способ?

+1

Вы можете инкапсулировать эту инструкцию insert в хранимую процедуру или udf и просто выполнить ее как можно больше, чтобы выполнить основную процедуру. Нет лучшего способа выполнить вставку ... select. –

+0

Я не знаком с термином, заключенным в хранимую процедуру. Можете ли вы предоставить мне любую ссылку, которая может быть полезной для меня? @Zohar – Amir

+1

инкапсулирует в этом случае просто означает создание метода, который будет выполнять вашу вставку (хранимая процедура или udf в этом случае). Затем вы можете выполнить этот метод вместо записи инструкции insert каждый раз. –

ответ

1

... но я должен использовать этот запрос несколько раз внутри хранимых процедур, которые делают, что хранимая процедура длительная ....

Проще всего было бы создать хранимую процедуру, которая только будет сделать вставку, а затем вызвать его всякий раз, когда вам нужно в вашей основной хранимой процедуры:

CREATE PROCEDURE CopyFromTable1ToTable2 
(
    @CustomValue int -- or whatever data type you need 
) 
AS 

INSERT INTO Table1 (Col1, Col2... Col120) 
SELECT Col1, Col2,.... @CustomValue 
FROM Table2 

затем в основной процедуре, просто сделать это:

EXEC CopyFromTable1ToTable2 1 
... 
EXEC CopyFromTable1ToTable2 3 

и так далее.

+0

Спасибо. Это будет лучше. – Amir

0

Попробуйте, если вы можете использовать Пользовательские типы таблиц для второго набора столбцов таблицы. Определите все необходимые столбцы из таблицы2 в этот новый тип таблицы. И затем используйте этот объект типа таблицы, чтобы использовать его в своих запросах, чтобы уменьшить требуемый код. Вы можете создать новый UDF для его повторного использования и передать этот новый тип в качестве одного из его параметров.

https://technet.microsoft.com/en-us/library/bb522526(v=sql.105).aspx

Я думаю, вы могли бы несколько уменьшить повторяющийся код SQL в хранимой процедуре. И это сделает ваш код более модульным и аккуратным.

Смежные вопросы