【问题标题】:Change database dynamically in SQL Server using a stored procedure使用存储过程在 SQL Server 中动态更改数据库
【发布时间】:2017-05-19 07:38:34
【问题描述】:

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

如何在将表数据加载到另一个表时使用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:来源: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 和数据库名称: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 和数据库名称:test1

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

最后需要像下面这样加载数据

数据库:测试和表:emptarget

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

数据库:test1 和表: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 

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

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

【问题讨论】:

    标签: tsql sql-server-2012


    【解决方案1】:

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

    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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      • 2019-03-17
      • 1970-01-01
      相关资源
      最近更新 更多