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

时间:2019-04-03 10:06:54

标签: sql-server sql-server-2014

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

我正在尝试查询服务器中的所有数据库以列出所有可用功能。大约有80个数据库,因此我将使用变量表将数据库列表传递给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'
.
.
.
.
.

4 个答案:

答案 0 :(得分:1)

您应该只可以在查询中使用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条件排除了您可能不需要的系统数据库。

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

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

答案 1 :(得分:0)

使用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

答案 2 :(得分:0)

您是否尝试过Dynamic-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

答案 3 :(得分:0)

下面是一种将所有数据库的查询结果作为单个结果集返回并包括数据库名称的方法。

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);