0

我需要从具有相同架构的表的多个数据库中获取数据。为此,我在其中一个数据库中为该表创建了同义词。数据库的数量会随着时间的推移而增长。因此,抓取数据的过程应该是灵活的。我写了下面的代码片段来解决这个问题:

WHILE @i < @count
BEGIN
    SELECT @synonymName = [Name]
    FROM Synonyms
    WHERE [ID] = @i
        SELECT @sql = 'SELECT TOP (1) * 
                FROM [dbo].[synonym' + @synonymName + '] as syn
                WHERE [syn].[Id] = tr.[Id]
                ORDER BY [syn].[System.ChangedDate] DESC'

        INSERT INTO @tmp
        SELECT  col1, col2
        FROM
        (
            SELECT * FROM TableThatHasRelatedDataFromAllTheSynonyms
            WHERE [Date] > @dateFrom 
        ) AS tr         
        OUTER APPLY (EXEC(@sql)) result 

    SET @i = @i + 1
END

我也感谢有关如何简化解决方案的任何想法。

4

2 回答 2

1

实际上,最好将所有表中的数据导入到一个表中(可能为源表名称添加额外的列)并使用它。可以通过 SP 或 SSIS 包进行导入。

关于最初的问题 - 您可以通过 exec 语句的 TVF 包装器来实现它(其中包含 exec .. into )。

UPD:正如评论中所指出的,exec 在 TVF 中不起作用。所以,如果你真的不想改变数据库结构并且你需要使用很多表,我建议:

  1. 或者从同义词***表中选择所有数据到变量中(我看到你只选择了一行)并使用它们
  2. 或者为完整的语句(使用插入等)准备动态 SQL,并在此处使用临时表而不是表变量。
于 2012-04-10T15:11:24.717 回答
0

我的解决方案很简单。只是将所有查询放入字符串并执行它。不幸的是,它比复制/粘贴所有同义词的代码慢 3 倍。

WHILE @i < @count
BEGIN
    SELECT @synonymName = [Name]
    FROM Synonyms
    WHERE [ID] = @i
        SELECT @sql = 'SELECT  col1, col2
        FROM
        (
            SELECT * FROM TableThatHasRelatedDataFromAllTheSynonyms
            WHERE [Date] > ''' + @dateFrom + '''
        ) AS tr         
        OUTER APPLY (SELECT TOP (1) * 
                FROM [dbo].[synonym' + @synonymName + '] as syn
                WHERE [syn].[Id] = tr.[Id]
                ORDER BY [syn].[System.ChangedDate] DESC) result'

        INSERT INTO @tmp
        EXEC(@sql)

    SET @i = @i + 1
END
于 2012-04-12T15:12:04.187 回答