Выполнить вставку для каждой строки, взятой из выделения?
У меня есть несколько записей, которые мне нужно вставить в несколько таблиц. Каждый столбец будет константой.
Бедный псевдо-код ниже - это то, что я хочу сделать:
create table #temp_buildings
(
building_id varchar(20)
)
insert into #temp_buildings (building_id) VALUES ('11070')
insert into #temp_buildings (building_id) VALUES ('11071')
insert into #temp_buildings (building_id) VALUES ('20570')
insert into #temp_buildings (building_id) VALUES ('21570')
insert into #temp_buildings (building_id) VALUES ('22570')
insert into property.portfolio_property_xref
( portfolio_id ,
building_id ,
created_date ,
last_modified_date
)
values
(
34 ,
(
select building_id
from #temp_buildings
) ,
getdate() ,
null
)
Цель: Выполните вставку в property.portfolio_property_xref для каждой записи в #temp_buildings
Думаю, я мог бы сделать это с помощью курсора, но считаю, что это было бы ужасно медленным. Поскольку это упражнение будет повторяемо в будущем, я бы скорее решил это быстрее, но я не уверен, как это сделать. Любая обратная связь будет оценена!
Ответы
Ответ 1
INSERT INTO table1 ( column1 )
SELECT col1
FROM table2
Как
insert into property.portfolio_property_xref
(
portfolio_id ,
building_id ,
created_date ,
last_modified_date
)
select
34,
building_id,
getdate(),
null
from
#temp_buildings
Ответ 2
Вы хотите использовать INSERT INTO SELECT FROM
(см. SQL Fiddle with Demo)
insert into property.portfolio_property_xref
(
portfolio_id ,
building_id ,
created_date ,
last_modified_date
)
SELECT 34 ,
building_id,
getdate(),
null
from #temp_buildings
Ответ 3
Какой-то случайный, но я считаю, что это может быть полезно любому, кто приходит сюда к этому вопросу. Иногда я использую Microsoft Excel VBA для создания частей SQL-заявлений, перечисленных выше. Я считаю, что это очень полезно, когда я нахожусь в ситуациях, когда я делаю построение таблиц и преобразование данных для создания нового задания. это действительно простой пример. Он создал связь между двумя отдельными несвязанными системами. Затем ссылка позволила мне создать новую таблицу в среде хранилища, которая объединила 3 несвязанные системы. Во всяком случае, это позволило мне создать > 5000 строк SQL (для использования в одно время - и небольшую часть гораздо большей задачи ETL) за считанные секунды.
Option Explicit
Dim arow As Integer
Dim acol As Integer
Dim lrow As Integer
Dim IsCellEmpty As String
Dim CustNo As Integer
Dim SkuLevel As Integer
Sub SkuLevelUpdate()
'find end ouf input file
arow = 1
acol = 1
Do
IsCellEmpty = Cells(arow, acol).Value
arow = arow + 1
Loop Until IsCellEmpty = ""
lrow = arow - 1
'Write SQL
arow = 2
acol = 5
Do
CustNo = Cells(arow, 1)
SkuLevel = Cells(arow, 4)
Cells(arow, acol) = "INSERT INTO dbo.#TempSkuLevelRelationships (CustNo, SkuLevel) VALUES (" & CustNo & ", " & SkuLevel & ");"
arow = arow + 1
Loop Until arow = lrow
End Sub
Да, я знаю все о SQL-инъекции и т.д. Я создаю электронную таблицу (ы), я копирую/вставляю данные в более крупный код SQL для новой конструкции, модификаций таблиц и т.п., когда данные в настоящее время не находятся в таблица SQL
Ответ 4
Попробуйте это
insert into property.portfolio_property_xref
(
portfolio_id ,
building_id ,
created_date ,
last_modified_date
)
Select
34,
building_id,
GETDATE(),
NULL
From #temp_buildings
Ответ 5
Вы говорите, что можете сделать это с помощью курсора. Как показывают другие ответы, вы не должны этого делать.
SQL Server является основанным на наборе RDMS, он более способен обрабатывать набор данных, а затем обрабатывать отдельные строки.