是否可以在 USE GO 子句中定义完整的 SELECT 子句?

Is it possible to define full SELECT clause in USE GO clause?

我正在尝试在 USE 中为数据库列表定义完整的 SELECT 子句。

我正在尝试查询服务器中的所有数据库以列出所有可用函数。大约有 80 个数据库,所以我将使用变量 table 将数据库列表传递给 USE 子句,以便能够在每个数据库和 运行 简单查询之间切换以列出其中的函数,所有通过 WHILE 循环。

是否可以做类似的事情,

USE
    (SELECT dBname
     From dBList
     where rowID=@currentRow)
GO

如果没有,有没有比一个一个地查询数据库更轻松的建议?

这是我在 MS SQL Server 2014 中所做的,但没有快乐,

declare @dBaseList Table
( RowID int not null primary key identity(1,1), dBname varchar(100)
)
declare @SeldBname varchar(100)
declare @rowsdBaseList int
declare @currentRow int
insert into @dBaseList (dBname)
SELECT name FROM sys.databases 

set @rowsdBaseList=@@ROWCOUNT
set @currentRow=0

while @currentRow<@rowsdBaseList
begin
    set @currentRow+=1
    use
        (select @SeldBname=dBname
        from @dBaseList
        where RowID=@currentRow)
    Go

    select * from sys.objects where type='FN'
end

它应该看起来像,

USE
    dBname1
GO
select * from sys.objects where type='FN'



USE 
    dBname2
GO
select * from sys.objects where type='FN'



USE
    dBname3
GO
select * from sys.objects where type='FN'
.
.
.
.
.

您应该只能在查询中使用由 3 部分组成的名称:

select * from dBname1.sys.objects where type='FN'
select * from dBname2.sys.objects where type='FN'
select * from dBname3.sys.objects where type='FN'

如果您更喜欢以编程方式进行,您可以使用(不受支持且未记录)sp_MSforeachdb proc:

EXEC sp_MSforeachdb 'IF DB_ID(''?'') > 4 BEGIN select * from ?.sys.objects where type=''FN'' END'

IF DB_ID(''?'') > 4 条件排除了您可能不需要的系统数据库。

关于在USE 语句中使用SELECT 语句,您不能按照您在问题中指定的那样进行操作。但是,如果需要,您可以将其合并到 sp_MSforeachdb 调用中:

EXEC sp_MSforeachdb 'IF DB_ID(''?'') > 4 BEGIN USE ?; select DB_NAME() AS [DatabaseName], * from sys.objects where type=''FN'' END'

使用sp_MSforeachdb

use [yourdatabase_in_which_you_store_the_results]
go
--create table functions_in_alldb(db nvarchar(100),fn_name nvarchar(200))
declare @functions_in_alldb as table(db nvarchar(100),fn_name nvarchar(200))
go
--truncate table functions_in_alldb
go
DECLARE @command varchar(1000) 
SELECT @command = 'USE ? 
if ''?'' not in (''master'',''msdb'',''tempdb'',''model'',''msdb'')
insert into @functions_in_alldb(db,fn_name) SELECT ''?'',name FROM sysobjects WHERE xtype = ''FN'' ORDER BY name' 
EXEC sp_MSforeachdb @command 

select * from @functions_in_alldb

你试过动态-SQL吗?类似于下面的代码,这只是一个示例,因为我现在没有我的机器来实际测试它。

SELECT name AS DatabaseName INTO #TEMP FROM master.dbo.sysdatabases

DECLARE @Count INT, @Database VARCHAR(MAX), @Query
    SET @Count = (SELECT COUNT(*) FROM #TEMP)

WHILE (@Count) > 0
BEGIN
    SET @Database = (SELECT TOP(1) DatabaseName FROM #TEMP)

    SET @Query = 'SELECT * FROM ' + @Database + '.sys.objects WHERE type = ''FN'''

    EXEC (@sqlCommand)

    DELETE FROM #TEMP WHERE DatabaseName = @Database

    SET @Count = (SELECT COUNT(*) FROM #TEMP)
END

下面是return将所有数据库的查询结果作为一个结果集并包含数据库名称的方法。

DECLARE @SQL nvarchar(MAX) =
    STUFF((
    SELECT ' UNION ALL SELECT N''' + name + N''' AS DatabaseName, * FROM ' + QUOTENAME(name) + N'.sys.objects where type=''FN'''
    FROM sys.databases
    FOR XML PATH(''), TYPE).value('.','nvarchar(MAX)'), 1, 11,'') + N';';
EXEC(@SQL);