对选择中的每一行执行插入操作?


73

我有许多记录需要插入多个表中。每隔一列将是一个常量。

下面的伪代码不好-这是我想做的:

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
        )

目的:对#temp_buildings上的每个记录对property.portfolio_property_xref进行插入

我想我可以用游标进行此操作-但相信这会非常慢。由于此练习将来会重复发生,因此我宁愿以更快的方法解决此问题,但不确定如何。对于任何反馈,我们都表示感谢!


1
提示:您还可以insert into #temp_buildings (building_id) VALUES ('11070'), ('11071'),...用于插入多行。
HABO 2012年

@Habo不错的一个-刚从我的脚本中剪了50行:)谢谢
Michael

Answers:


142
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

8
ck 如果真是这么简单,我会感到很尴尬:)
Michael A

但那里限制为每行1000行insert into select from
procma,

@procma我认为这不是真的。你有证据吗
贾斯汀·斯基尔斯

抱歉,您是对的,不是在表到表的插入中,而是在说“手动”批处理到表的插入中明确地定义了,在INSERT INTO table1 (ID, Col1) VALUES (123, 'abc'), (124, 'def'), (125, 'ghi')那里您只能有1000个值组
procma,

8

您将要使用INSERT INTO SELECT FROM(请参阅带有演示的SQL Fiddle

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

有点随机,但是我觉得这对任何遇到此问题的人都可能有用。有时,我使用Microsoft Excel VBA生成部分SQL语句,如上面所列。当我要进行表构建和数据转换以建立新工作时,我发现这非常有用。这是一个非常简单的例子。它在2个独立的不相关系统之间创建了链接。然后,该链接使我可以在将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表中


0

尝试这个

   insert into property.portfolio_property_xref
   ( 
      portfolio_id ,
      building_id ,
      created_date ,
      last_modified_date
   )
   Select
      34,
      building_id,
      GETDATE(),
      NULL
   From #temp_buildings

0

您说的是可以使用光标来完成。正如其他答案所显示的那样,您不必这样做。SQL Server是基于集合的RDMS,它更有能力处理一组数据,然后处理单行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.