web-dev-qa-db-fra.com

Effectuer l'insertion pour chaque ligne tirée d'une sélection?

J'ai un certain nombre d'enregistrements que je dois insérer dans plusieurs tables. Chaque autre colonne sera une constante.

Pauvre pseudo-code ci-dessous - c'est ce que je veux faire:

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
        )

Intent: Effectuer une insertion dans property.portfolio_property_xref pour chaque enregistrement sur #temp_buildings

Je pense que je pourrais le faire avec un curseur - mais je crois que ce serait horriblement lent. Comme cet exercice sera reproductible à l'avenir, je préfère aborder cette question plus rapidement, mais je ne sais pas comment. Tout commentaire serait apprécié!

62
Michael A
INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2

Comme:

insert into property.portfolio_property_xref
( 
    portfolio_id ,
    building_id ,
    created_date ,
    last_modified_date
)
select
    34,
    building_id,
    getdate(),
    null
from
    #temp_buildings
124
Justin Skiles

Vous voudrez utiliser INSERT INTO SELECT FROM (Voir 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
6
Taryn

Un peu aléatoire, mais je pense que cela peut être utile à quiconque vient ici pour cette question. Parfois, j'utilise Microsoft Excel VBA pour générer des parties d'instructions SQL comme indiqué ci-dessus. Je trouve cela très utile lorsque je suis dans des situations où je fais de la construction de tables et de la transformation de données pour configurer un nouveau travail. ceci est un exemple vraiment simple. Il a créé un lien entre 2 systèmes indépendants non liés. Ensuite, le lien m'a permis de construire une nouvelle table dans un environnement d'entrepôt qui a lié 3 systèmes indépendants. Quoi qu'il en soit, cela m'a permis de créer> 5000 lignes de SQL (pour une utilisation ponctuelle - et une petite partie d'une tâche ETL beaucoup plus importante) en quelques secondes.

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

Oui, je sais tout sur l'injection SQL, etc. Je crée la ou les feuilles de calcul, je copie/colle les données dans un code SQL plus grand pour une nouvelle construction, des modifications de table, etc. lorsque les données ne résident pas actuellement dans une table SQL

2
Jon Milliken

Essaye ça

   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
codingbiz

Vous dites que vous pouvez le faire avec un curseur. Comme les autres réponses vous le montrent, vous n'aurez pas à le faire. SQL Server est un RDMS basé sur un ensemble, il est plus capable de traiter un ensemble de données, puis de traiter des lignes simples.

0
Mark Kremers