데이터베이스 이름을 인수로 사용하여 해당 데이터베이스의 인덱스 테이블과 조각화 수준을 반환하는 저장 프로 시저를 작성 중입니다. 이 저장 프로시 저는 DBA 데이터베이스 (DBA가 사물을 모니터링하고 최적화하는 데 사용하는 테이블이 포함 된 DB)에 있습니다. 차이가 있다면 문제의 시스템은 모두 SQL Server 2008 R2입니다.
기본 쿼리가 해결되었지만 인덱스의 실제 이름을 제공하려고 노력하고 있습니다. 내가 아는 한, 그 정보는 각 개인의 sys.indexes 뷰에 포함되어 있습니다. 내 특정 문제는 다른 데이터베이스의 저장 프로 시저에서 프로그래밍 방식으로 해당 뷰를 참조하려고합니다.
이를 설명하기 위해이 부분은 문제가되는 쿼리의 일부입니다.
FROM sys.dm_db_index_physical_stats(@db_id,NULL,NULL,NULL,NULL) p
INNER JOIN sys.indexes b ON p.[object_id] = b.[object_id]
AND p.index_id = b.index_id
AND b.index_id != 0
@db_id로 식별 된 데이터베이스에서 적절한 sys.indexes 뷰를 사용하고 있기 때문에 쿼리가 제대로 작동합니다. 그러나 DBA 데이터베이스에서 이것을 호출하려고하면 sys.indexes보기가 잘못된 데이터베이스에 대한 것이므로 모두 null이됩니다.
더 일반적인 용어로, 나는 다음과 같은 것을 할 수 있어야합니다.
DECLARE @db_name NVARCHAR(255) = 'my_database';
SELECT * FROM @db_name + '.sys.indexes';
또는
USE @db_name;
문자열 연결과 OBJECT_NAME / OBJECT_ID / DB_ID 함수의 조합을 사용하여 데이터베이스를 전환하거나 다른 데이터베이스를 참조하려고 시도했지만 아무것도 작동하지 않는 것 같습니다. 커뮤니티가 가질 수있는 아이디어에 대해 감사하지만 각 저장 데이터베이스에 상주하기 위해이 저장 프로 시저를 재구성해야한다고 생각합니다.
어떤 제안이라도 미리 감사드립니다.