我正在尝试在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'
.
.
.
.
.
答案 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)
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);