Можно ли определить полное предложение SELECT в предложении USE GO? - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь определить полное предложение SELECT в USE для списка баз данных.

Я пытаюсь выполнить запрос по всем базам данных на сервере, чтобы получить список всех доступных функций. Существует около 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 ]

1 голос
/ 03 апреля 2019

Вы должны иметь возможность использовать имя из трех частей в запросе:

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'
0 голосов
/ 03 апреля 2019

Ниже приведен метод для возврата результатов запроса из всех баз данных в виде единого набора результатов и включения имени базы данных.

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);
0 голосов
/ 03 апреля 2019

Вы пробовали 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
0 голосов
/ 03 апреля 2019

использование 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
...