【问题标题】:Get list of all databases that have a view named 'foo' in them获取其中包含名为“foo”的视图的所有数据库的列表
【发布时间】:2014-08-21 14:28:24
【问题描述】:

我有几台服务器,里面有一堆数据库。 一些数据库有一个名为 vw_mydata 的视图。

我要做的是创建一个包含名为 vw_mydata 的视图的所有数据库的列表,然后执行该视图并将其内容存储在一个表中,然后该表包含来自所有 vw_mydata 的所有数据。

我知道我可以使用

找到包含该视图的所有数据库
sp_msforeachdb 'select "?" AS dbName from [?].sys.views where name like ''vw_mydata'''

但是我的记录集和数据库一样多。我如何使用它来循环访问数据库?

我更喜欢一个简洁的数据库名称列表,然后我可以将其存储在结果集中。这样就很简单了。

我曾考虑在 TSQL 之上运行并将结果存储在一个表中,但我想将其全部保存在一个 SSIS 包中,而不是到处乱放所有类型的表/过程。我可以在 SSIS 的执行 SQL 任务中使用 #table 吗?

【问题讨论】:

    标签: sql sql-server ssis sql-server-2012 ssis-2012


    【解决方案1】:
    DECLARE @Tsql VARCHAR(MAX)
    SET @Tsql = ''
    
    SELECT @Tsql = @Tsql + 'SELECT ''' + d.name + ''' AS dbName FROM [' + d.name + '].sys.views WHERE name LIKE ''vw_mydata'' UNION '
    FROM master.sys.databases d
    
    --"trim" the last UNION from the end of the tsql.
    SET @Tsql = LEFT(@Tsql, LEN(@Tsql) - 6)
    
    PRINT @Tsql
    
    --Uncomment when ready to proceed
    --EXEC (@Tsql)
    

    【讨论】:

    • 这仅在您的帐户有权访问系统上的每个数据库时才有效,仅供参考。
    • 这很好用。我们使用一个在所有数据库上都有 db_datareader 的帐户。我更改了一个小细节:FROM master.sys.databases d WHERE d.state = 0。有一些数据库离线,它崩溃了。
    • @Henrov,关于离线数据库的精彩观点。您可能还想过滤掉系统数据库、数据库快照等。
    【解决方案2】:

    要在 SSIS 中使用临时表,您需要使用全局临时表 (##TABLE)。

    关于连接的属性,我很确定您需要将 RetainSameConnection 设置为 TRUE

    在创建临时表后的 SQL 任务中,您需要将 DelayValidation 设置为 TRUE

    【讨论】:

    • 谢谢,不幸的是,我只能将一个答案标记为答案,但你也应该得到它的信息!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 2023-01-20
    • 1970-01-01
    • 2016-05-13
    • 2019-10-12
    相关资源
    最近更新 更多