如何将数据库列表传递给 sp_MSforeachdb?

Mar*_*lli 2 sql-server dynamic-sql sql-server-2008-r2 sql-server-2012 sql-server-2014

我有以下脚本,运行时给我一个逗号分隔的数据库名称列表。

        SET NOCOUNT ON
        declare @db_list NVARCHAR(MAX)
        DECLARE @command varchar(1000)

        SELECT @COMMAND = 'SELECT DB_NAME()'

         SELECT @db_list  = STUFF((
                                    SELECT ', ' + name FROM sys.databases
                                    WHERE name like '__Order'
                                    FOR XML PATH(''), 
                                    TYPE).value('.[1]', 'nvarchar(max)'), 1, 2, '')

         -- in case there are no DBs to show, then show no DB '***'
         select @db_list = COALESCE(@db_list,'***') 

         SELECT @db_list = RTRIM(LTRIM(REPLACE(@DB_LIST,',', ',''')))  


         select @db_list 
Run Code Online (Sandbox Code Playgroud)

这给了我以下结果:

UKOrder,' ATOrder,' AUOrder
Run Code Online (Sandbox Code Playgroud)

1)这给出了错误的结果集,我希望它是

'UKOrder','ATOrder','AUOrder'
Run Code Online (Sandbox Code Playgroud)

2) 如何将@db_list 传递给 sp_MSforeachdb?

假设我想跑

选择 db_name()

在@db_list 中的每个数据库中

英国订单

订单

AU订单

Aar*_*and 5

你不能。此外,在它似乎有效的情况下,您也不应该使用这个未记录的、不受支持的、有缺陷的过程。我在这里这里写了一个更好的替代品。

事实上,我编写的过程确实支持参数@database_list, 形式'db1, db2, db3'(注意根本不需要对嵌入的单引号大惊小怪),因此根据您的需要采用它 - 而不是重新发明轮子 - 似乎合乎逻辑。

如果您需要有关从集合中构建分隔字符串用于其他目的的语法方面的帮助,请创建一个不同的问题。如果您确实需要将每个数据库名称括在其自己的引号中,则REPLACE命令中的最后一个字符串元素应该是,''','''并且您还需要在开始和结束处用单引号将最终结果括起来。