2012-08-01 13 views
39

Tengo una serie de registros que debo insertar en varias tablas. Cada otra columna será una constante.¿Realizar inserción para cada fila tomada desde una selección?

pobre pseudo código abajo - esto es lo que quiero hacer:

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 
     ) 

Intención: realiza una inserción en property.portfolio_property_xref para cada registro en #temp_buildings

creo que podría hacer esto con un cursor, pero cree que esto sería terriblemente lento. Como este ejercicio será repetible en el futuro, prefiero abordar esto de forma más rápida, pero no estoy seguro de cómo hacerlo. ¡Cualquier comentario sería apreciado!

+1

Sugerencia: También puede usar 'insert into #temp_buildings (building_id) VALUES ('11070'), ('11071'), ...' para insertar varias filas. – HABO

+0

@Habo Nice one - acaba de cortar unas buenas 50 filas de mi script :) Gracias- – Codingo

Respuesta

88
INSERT INTO table1 (column1) 
SELECT col1 
FROM table2 

igual:

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

Eck. Estoy avergonzado si es así de simple :) – Codingo

+22

Nunca lo sé hasta que lo preguntes, ¿verdad? –

0

probar este

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

Usted tendrá que usar INSERT INTO SELECT FROM (Ver 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 
0

Usted está diciendo que puede hacerlo con un cursor Como las otras respuestas te muestran, no tendrás que hacerlo. SQL Server es un RDMS basado en conjunto, es más capaz de procesar un conjunto de datos y luego procesar líneas únicas.

1

Un poco aleatorio, pero creo que esto puede ser útil para cualquiera que se acerque a esta pregunta. Algunas veces, utilizo Microsoft Excel VBA para generar porciones de declaraciones SQL como las enumeradas arriba. Me parece muy útil cuando estoy en situaciones en las que estoy haciendo la construcción de tablas y la transformación de datos para establecer un nuevo trabajo. este es un ejemplo realmente simple. Creó un enlace entre 2 sistemas independientes no relacionados. Luego, el enlace me permitió construir una nueva tabla en un entorno de almacén que vinculaba 3 sistemas no relacionados entre sí. De todos modos, me permitió crear> 5000 líneas de SQL (para una sola vez, y una pequeña parte de una tarea ETL mucho más grande) en segundos.

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 

Sí, lo sé todo sobre la inyección SQL, etc. puedo crear la hoja de cálculo (s), copio/pegar los datos en código SQL más grande para la nueva construcción, modificación de tablas, y similares cuando los datos lo hace no reside actualmente en una tabla SQL

Cuestiones relacionadas