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é!
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
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
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
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
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.