0

I am a C# dev learning SQL.

I need to publish data from one database, to another which already has the same structure and which are both on the same instance of Sql Server. By publish, I mean I want all the id's and data to be exactly the same.

The second database is an exact copy of the first.

This is the query:

Select vev.* from [dbo].[metadata_document_set] mds

inner join
[dbo].[document_metadata] dm
on mds.metadata_document_set_id = dm.metadata_document_set_id

inner join [dbo].[segment_metadata] sm
on dm.document_metadata_id = sm.document_metadata_id

inner join [dbo].[element_metadata] em
on sm.segment_metadata_id = em.segment_metadata_id

inner join [dbo].[valid_element_value] vev
on em.element_metadata_id = vev.element_metadata_id

where mds.code = 'PA'

I need to insert all the rows of valid_element_values, as well as element_metadata, segment_metadata, and document_metadata.

How do I do that?

Greg Gum
  • 33,478
  • 39
  • 162
  • 233

3 Answers3

2

If you are inserting to separate tables, you will have to do it one insert at a time.

insert [new_database_name].[dbo].[metadata_document_set]
Select * from [old_database_name].[dbo].[metadata_document_set] 
where code = 'PA'

insert [new_database_name].[dbo].[document_metadata]
Select * from [old_database_name].[dbo].[document_metadata] 
<filter as required>

and so on.

This assumes your tables are exactly the same.

NB This will not work if you have INDENTITY columns.

Stephen
  • 1,532
  • 1
  • 9
  • 17
1

Select vev.* will select columns only from valid_element_value table so remove vev.* from select and mention the columns from all four table in same order as your Insert column list

Considering the target tables are created with all the required column in target database

Update : Looks like you want to insert into four different tables. Then you need four different Insert statements

INSERT INTO target_database.SCHEMA.target_valid_element_value
            (vev_col1,
             vev_col2,
             ..)
SELECT vev.col1,
       vev.col2,
       ..
FROM   [dbo].[metadata_document_set] mds
       INNER JOIN [dbo].[document_metadata] dm
               ON mds.metadata_document_set_id = dm.metadata_document_set_id
       INNER JOIN [dbo].[segment_metadata] sm
               ON dm.document_metadata_id = sm.document_metadata_id
       INNER JOIN [dbo].[element_metadata] em
               ON sm.segment_metadata_id = em.segment_metadata_id
       INNER JOIN [dbo].[valid_element_value] vev
               ON em.element_metadata_id = vev.element_metadata_id
WHERE  mds.code = 'PA' 


INSERT INTO target_database.SCHEMA.target_element_metadata
            (em_col1,
             em_col2,
             ..)
SELECT em.col1,
       em.col2,
       ..
FROM   [dbo].[metadata_document_set] mds
       INNER JOIN [dbo].[document_metadata] dm
               ON mds.metadata_document_set_id = dm.metadata_document_set_id
       INNER JOIN [dbo].[segment_metadata] sm
               ON dm.document_metadata_id = sm.document_metadata_id
       INNER JOIN [dbo].[element_metadata] em
               ON sm.segment_metadata_id = em.segment_metadata_id
       INNER JOIN [dbo].[valid_element_value] vev
               ON em.element_metadata_id = vev.element_metadata_id
WHERE  mds.code = 'PA' 

Regarding Identity, If you have identity column in your target tables and you want insert values from source for those columns as well then

set Identity_insert target_table ON 
<<Insert statement>>
set Identity_insert target_table OFF

If you dont want to explicitly insert values into identity column then dont add identity column in Insert & Select column list

Pரதீப்
  • 91,748
  • 19
  • 131
  • 172
0

Lets say you have [dbo1].[metadata_document_set1] table (and it has all the columns in select query)then

INSERT INTO [dbo1].[metadata_document_set1]
Select vev.*,em.*,sm.*,dm.*,mds.* from [dbo].[metadata_document_set] mds        
inner join [dbo].[document_metadata] dm

on mds.metadata_document_set_id = dm.metadata_document_set_id

inner join [dbo].[segment_metadata] sm
on dm.document_metadata_id = sm.document_metadata_id

inner join [dbo].[element_metadata] em
on sm.segment_metadata_id = em.segment_metadata_id

inner join [dbo].[valid_element_value] vev
on em.element_metadata_id = vev.element_metadata_id

where mds.code = 'PA'
Paresh
  • 564
  • 6
  • 23