85

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

下面的伪代码很差 - 这就是我想要做的:

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

我想我可以用光标来做到这一点 - 但相信这会非常慢。由于这个练习将来可以重复,我宁愿以更快的方法解决这个问题,但我不确定如何。对于任何反馈,我们都表示感谢!

4

5 回答 5

159
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
于 2012-08-01T00:40:10.403 回答
12

您将要使用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
于 2012-08-01T00:41:51.787 回答
2

有点随机,但我觉得这可能对任何来这里回答这个问题的人有用。有时,我使用 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 表中时进行新的构造、表修改等

于 2016-12-05T16:53:19.700 回答
0

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

于 2012-08-01T06:08:35.757 回答
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
于 2012-08-01T00:41:41.090 回答