Estou convertendo um procedimento para usar um Linked Server, pois os bancos de dados aos quais ele faz referência já foram migrados para Clusters separados. Estou quase terminando este trabalho, mas não estou preso na parte seguinte;
declare @CustomerId int
set @CustomerId = 2
exec (N'
USE [DatabaseName]
SELECT @DiskUsageDataObjectsKB = SUM(alloUni.used_pages) * 8
FROM sys.tables sysTab
INNER JOIN sys.indexes ind
ON sysTab.OBJECT_ID = ind.OBJECT_ID and ind.Index_ID<=1
INNER JOIN sys.partitions parti
ON ind.OBJECT_ID = parti.OBJECT_ID AND ind.index_id = parti.index_id
INNER JOIN sys.allocation_units alloUni
ON parti.partition_id = alloUni.container_id
WHERE SCHEMA_NAME(sysTab.SCHEMA_ID) = CAST('+ @CustomerId +' AS NVARCHAR(MAX))') AT [LinkedServer]
select @DiskUsageDataObjectsKB
Como você pode ver, estou passando a variável CustomerId para isso usando SQL dinâmico, mas não tenho certeza de como obter o valor @DiskUsageDataObjectsKB de volta ao procedimento, para que ele possa ser adicionado ao nosso banco de dados de relatórios.
Alguém teria alguma sugestão de como isso pode ser feito, por favor?
Muito Obrigado! Tom
Você deve usar sp_executesql com parâmetro de saída.
Eu tenho o exemplo daqui .
Ok, então acontece que eu estava apenas complicando demais essa coisa toda. Eu só precisava adicionar o valor [LinkedServer].[DatabaseName] ao script como você normalmente faz.
Eu não sabia que você poderia fazer isso ao referenciar objetos sys, mas você pode.