0

我在这里和其他地方搜索过,还没有找到答案。希望我没有错过。

使用 SQL Server Management Studio 2008 R2。

我的服务器上有 n 个特定数据库(还有其他数据库,但我只对其中一些感兴趣)

这些数据库中的每一个都有一个表,它们都具有相同的名称。唯一的区别是数据库名称。我想将这些表聚合在一起,在不同的数据库(不同于其他数据库)上创建一个大表。

我可以从查询结果中获取数据库名称。

N 未知。

循环是解决这个问题的方法吗?

我正在考虑以下伪代码的内容:

Set @dbnames = SELECT DISTINCT dbname FROM MyServer.dbo.MyTable

For each @name in @dbnames
    INSERT INTO ADifferentDB.dbo.MyOtherTable
    SELECT * FROM @name.dbo.table
Next name

(显然我对使用 SQL 变量也是新手,如您所见)

4

3 回答 3

4

你的第一个问题是关于迭代数据库:你可以用游标来做

然后你有另一个问题,执行一个查询,其中一部分是变量(数据库的名称)。你可以用execute函数来做到这一点。

所有这些都与此类似:

DECLARE @query VARCHAR(max)
DECLARE @dbname VARCHAR(100)
DECLARE my_db_cursor CURSOR
            FOR SELECT DISTINCT dbname FROM MyServer.dbo.MyTable
OPEN my_db_cursor 
FETCH NEXT FROM my_db_cursor 
INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @query = 'INSERT INTO ADifferentDB.dbo.MyOtherTable
                   SELECT * FROM ' + @dbname + '.dbo.table'
    EXECUTE(@query)  

    FETCH NEXT FROM my_db_cursor 
    INTO @dbname
END
CLOSE my_db_cursor 
DEALLOCATE my_db_cursor 
于 2012-09-28T18:10:29.623 回答
1

您要做的是CURSOR为行级操作定义一个。这是一些文档

于 2012-09-28T18:01:24.500 回答
1

我建议使用sp_MSForEachDB

EXEC sp_MSForEachDB '
-- Include only the databases you care about.
IF NOT EXISTS (
    SELECT *
    FROM MySever.dbo.MyTable
    WHERE dbname = ''?''
)
    -- Exit if the database is not in your table.
    RETURN

-- Otherwise, perform your insert.
INSERT INTO ADifferentDB.dbo.MyOtherTable
SELECT * FROM ?.dbo.table
'

在这种情况下,?是一个被服务器上的每个数据库替换的令牌。

于 2012-09-28T18:17:31.820 回答