Preciso descobrir o espaço usado pelo arquivo de banco de dados para vários bancos de dados por meio do servidor vinculado (de um servidor central a vários servidores SQL do cliente). Eu criei view no tamanho do cliente, para todos os bancos de dados:
CREATE VIEW [dbo].[view] AS SELECT name AS 'DataFileName',
physical_name AS 'DataPhysicalName',
ROUND(size / 128, 1) AS 'DataTotalSizeInMB',
ROUND(CAST(FILEPROPERTY(name, 'SpaceUsed') AS int) / 128.0, 1) AS
'DataSpaceUsedInMB',
ROUND(size / 128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int) / 128.0, 1) AS
'DataAvailableSpaceInMB' FROM [sys].[database_files] WHERE type = 0
e no lado do servidor eu usei loop para consultar esta visão. Mas a coluna "DataSpaceUsedInMB" funciona apenas para o banco de dados padrão para meu login.
@cicik, se você estiver percorrendo os bancos de dados em seu servidor local como você mencionou, supondo que você já tenha a lista de bancos de dados remotos armazenados em algum lugar em uma tabela local, você pode percorrer os bancos de dados (por exemplo, cursor) e executar,
SELECT * FROM [YourLinkedServer].[YourRemoteDatabase].[dbo].[view];
Isso deve colocar o contexto do banco de dados remoto no banco de dados especificado e, portanto, funciona para a função FILEPROPERTY e sys.database_files dmv que retornam valores apenas para o banco de dados atual.
Além disso, você pode querer considerar extrair a lista de bancos de dados no servidor remoto e executar o script em cada execução no servidor remoto (lado do cliente) para não precisar criar a exibição em cada banco de dados e não perder quaisquer novos bancos de dados criados sem o seu conhecimento.
ATUALIZAÇÃO Se você quiser usar o script para extrair dinamicamente os dados do servidor vinculado sem adicionar a exibição em todos os bancos de dados,
Certifique-se de que seu login tenha acesso a todos os bancos de dados no servidor remoto.
Mas a coluna "DataSpaceUsedInMB" funciona apenas para o banco de dados padrão para meu login.
Você tem que usar : sys.master_files :
Você está usando sys.database_files :
Portanto,
SELECT * FROM sys.master_files
listará os arquivos para cada banco de dados na instância, enquantoSELECT * FROM sys.database_files
listará os arquivos para o contexto de banco de dados específico.Observação: se você não estiver vendo as linhas de sys.master_files, pode ser um problema de permissão, pois o BOL afirma:
Considerando que para sys.database_files requer apenas associação na função pública.
Atualização: conforme destacado, você pode usar seu script existente com uma maneira de fazer um loop em todos os bancos de dados e armazenar o resultado em uma tabela e, em seguida, criar uma exibição (se desejar).
Você pode usar o script abaixo:
ATUALIZAÇÃO (21/06/2013):
SE você deseja executar a consulta em vários servidores, o Powershell ou SQLCMD é sua melhor opção.
Usando servidores vinculados, você deve usar OPENROWSET ou OPENQUERY .
SE você tiver apenas alguns servidores, criar um servidor vinculado ao principal funcionará bem, conforme abaixo:
Nota: SQL2005 é um servidor vinculado.
De BOL em FILEPROPERTY: "Retorna o valor da propriedade de nome de arquivo especificado quando um nome de arquivo no banco de dados atual e um nome de propriedade são especificados. Retorna NULL para arquivos que não estão no banco de dados atual."
Você terá que executar sua consulta no contexto de cada banco de dados para encontrar o SpaceUsed. Você poderia fazer algo assim:
Primeiro crie uma tabela para armazenar os dados (ou uma tabela temporária, se desejar):
Então você terá que preencher esta tabela com os dados (vou usar sp_msforeachdb para simplificar. Você também pode usar um cursor).
Então você pode repovoar a tabela quantas vezes quiser. Você deve ser capaz de consultar esta tabela por meio de uma conexão de servidor vinculada para localizar os dados que está procurando.