首页 > 解决方案 > 循环遍历表名列表并执行语句

问题描述

我正在尝试获取满足某些约束的数据库中表的名称列表。

有了这个名称列表,我想将数据复制到另一个数据库的表中。

我认为我下面的循环将除一件事之外起作用。我不确定如何设置变量@tblName?

例如说下面是表名列表

 1. tblA
 2. tblB
 3. tblZ

在我的第一个循环中,我只想将@tblName 设置为 tblA。

我的代码

declare @numTbls int
declare @count int = 1
declare @tblName nvarchar(100)

set @numTbls = (select count(*) from INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE'  and TABLE_NAME like '%somePattern%')

while @count <= @numTbls

    begin

    set @tblName = (select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE' and TABLE_NAME like '%somePattern%')

     exec ('insert into DATABASE_B.dbo.' + @tblName + ' select * from DATABASE_A.dbo.' + @tblName)

     set @count = @count + 1
 end

标签: sql-server

解决方案


您实际上并不需要循环来执行此操作

DECLARE @SQL    NVARCHAR(MAX)

SELECT  @SQL    = ISNULL(@SQL, '') 
                + 'INSERT INTO DATABASE_B.dbo.' + QUOTENAME(TABLE_NAME) 
                + ' SELECT * FROM DATABASE_A.dbo.' + QUOTENAME(TABLE_NAME) + ';' + char(13)
FROM    INFORMATION_SCHEMA.TABLES 
WHERE   TABLE_TYPE = 'BASE TABLE'  
AND     TABLE_NAME like '%somePattern%'

PRINT   @SQL
EXEC    sp_executesql @SQL

注意:这是假设两个数据库中表的架构相同且列序列相同


推荐阅读