使用存储过程在SQL Server中动态更改数据库

时间:2017-05-19 07:38:34

标签: tsql sql-server-2012

我有一个关于SQL Server的问题:如何动态更改数据库名称,并使用一个select和insert statment来使用存储过程加载数据。

当表数据加载到另一个表时,如何使用insert和select语句更改数据库名称?

这里将每个数据库名称相关表加载到与数据库名称相关的目标表中。

即数据库:测试和源表:emp目标表是:emptarget这里emp表记录加载到emptarget类似于另一个数据库

数据库名称信息维护一个表。

USE [test]
GO

CREATE TABLE [dbo].[databaseinformation]
(
    [id] [int] NULL,
    [databasename] [varchar](50) NULL
) ON [PRIMARY]
GO

INSERT [dbo].[databaseinformation] ([id], [databasename]) 
VALUES (1, N'test'), (2, N'test1')
GO

表1:source:emp和datbasename:test

USE [test]
CREATE TABLE [dbo].[emp]
(
    [id] [int] NULL,
    [name] [varchar](50) NULL,
    [sal] [int] NULL
) 

INSERT [dbo].[emp] ([id], [name], [sal]) 
VALUES (19, N'hd', 40), (1, N'g', 10),
       (9, N'dk', 90), (80, N'dhe', 80)
GO

目标表:emptarget和databasename:test

USE [test]
CREATE TABLE [dbo].[emptarget]
(
    [id] [int] NULL,
    [name] [varchar](50) NULL,
    [sal] [int] NULL
) 

----table 2: emp and databasename: test1
USE [test]
CREATE TABLE [dbo].[emp]
(
    [id] [int] NULL,
    [name] [varchar](50) NULL,
    [sal] [int] NULL
) 

INSERT [dbo].[emp] ([id], [name], [sal]) 
VALUES (50, N'kl', 80), 39, N'abc', 10)
go

目标表:emptarget和databasename:test1

USE [test1]
CREATE TABLE [dbo].[emptarget]
(
    [id] [int] NULL,
    [name] [varchar](50) NULL,
    [sal] [int] NULL
) 

最后需要加载如下的数据

数据库:test和table:emptarget

id  |name   |sal
19  |hd |40
1   |g  |10
9   |dk |90
80  |dhe    |80

数据库:test1和table:emptarget

id  |name   |sal
50  |kl |80
39  |abc    |10

我试过以下

USE [test]
GO

insert into emptarget 
select * from emp 

USE [test1]
GO
insert into emptarget 
select * from emp 

这里我不想单独运行两个查询。我需要使用single select和insert语句运行查询,以便使用数据库加载数据对应表。

请告诉我如何编写查询以在SQL Server中执行此任务

1 个答案:

答案 0 :(得分:0)

实际上我不知道为什么你不这样做。

insert into test.emptarget select * from test.emp; 
insert into test1.emptarget select * from test1.emp;

所以我认为你只想要一个查询来做到这一点。

create procedure emptoemptarget (@DBName nvarchar(10))
as
begin
    declare @sql nvarchar(1000)

    set @sql = 'insert into ' + @DBName + '.emptarget select * from ' + @DBName + '.emp'

    exec (@sql)
end


select dbo.emptoemptarget(name) from sys.databases where name in ('test','test1')