87 votes

Effectuer une insertion pour chaque ligne provenant d'une sélection ?

J'ai un certain nombre d'enregistrements que je dois insérer dans plusieurs tables. Toutes les autres colonnes seront des constantes.

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
        )

Intention : 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 répétable à l'avenir, je préférerais l'aborder d'une manière plus rapide, mais je ne sais pas comment. Tout commentaire serait apprécié !

162voto

Justin Skiles Points 2885
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

12voto

bluefeet Points 105508

Vous voudrez utiliser INSERT INTO SELECT FROM (Voir Bricolage SQL avec démo )

insert into property.portfolio_property_xref
( 
    portfolio_id ,
    building_id ,
    created_date ,
    last_modified_date
)
SELECT 34 ,
       building_id,
       getdate(),
       null
from    #temp_buildings

2voto

Jon Milliken Points 121

C'est un peu au hasard, mais je pense que cela peut être utile à tous ceux qui viennent ici pour poser cette question. J'utilise parfois Microsoft Excel VBA pour générer des parties de déclarations SQL comme celles énumérées ci-dessus. Je trouve cela très utile lorsque je suis dans des situations où je fais de la construction de tableau et de la transformation de données pour mettre en place un nouveau travail. ceci est un exemple vraiment simple. Il a permis de créer un lien entre deux systèmes distincts sans rapport entre eux. Ensuite, le lien m'a permis de construire une nouvelle table dans un environnement d'entrepôt qui reliait 3 systèmes non liés entre eux. 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 important pour les nouvelles constructions, les modifications de tables, etc. lorsque les données ne résident pas actuellement dans une table SQL.

0voto

codingbiz Points 15211

Essayez ceci

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

0voto

Mark Kremers Points 720

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 SGBDR basé sur un ensemble, il est plus capable de traiter un ensemble de données que de traiter des lignes individuelles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X