2015-01-29 1 views
0

DB와 뷰 및 테이블이 대량으로 연결된 여러 연결된 서버가 있습니다. 데이터베이스 이름은 임의의 문자 및 숫자 집합과 비슷하며 저에게 의미가 없습니다. 특정보기가있는 서버를 찾아야합니다.크로스 서버 EXEC

DECLARE @servers AS TABLE (srv_name NVARCHAR(300), srv_providername NVARCHAR(300), srv_product NVARCHAR(300), srv_datasource NVARCHAR(300), srv_pstring NVARCHAR(300), srv_location NVARCHAR(300), srv_cat NVARCHAR(300)); 
INSERT INTO @servers EXEC sp_linkedservers 

DECLARE @sql nvarchar(MAX) = N'' 

SELECT @sql += 
N'SELECT 
    ''' + QUOTENAME(srv_name) + ''' AS [Server], 
    QUOTENAME(name) AS [DB] 
FROM ' + QUOTENAME(srv_name) + '.[master].[sys].[databases] 
WHERE HAS_PERMS_BY_NAME(name, ''DATABASE'', ''SELECT'') = 1 
UNION ALL 
' 
FROM @servers 

SET @sql = LEFT(@sql, LEN(@sql) - 11); 
EXEC @sql 

그리고 EXEC에서 실패합니다. 해당 쿼리가 유효하지 않지만 쿼리를 복사하여 붙여 넣으면 실행하면됩니다.

각 서버

/1 서버

> (1 row(s) affected) Msg 203, Level 16, State 2, Line 17 The name 
> 'SELECT 
>  '[localhost]' AS [Server], 
>  QUOTENAME(name) AS [DB] FROM [localhost].[master].[sys].[databases] WHERE HAS_PERMS_BY_NAME(name, 
> 'DATABASE', 'SELECT') = 1 ' is not a valid identifier. 
+0

왜'입니까? – Darka

+0

그것이 동적 SQL을 생성하는 데 사용하는 연결된 서버의 임시 테이블 원인 – Yurgen

+0

yeap 바로 바보 같은 질문. 죄송합니다 – Darka

답변

1

와트 내 로컬 호스트의 출력을 각 DB의 sys.all_object를 쿼리, 서버 및 사용 가능한 데이터베이스 승/임시 테이블을 생성하기 위해,이 간부를 수행 할 필요가 나도 같은 실수를했다. 그래서 그냥 다음과 같이 실행 : 외부 문자열 @ servers` FROM

exec sp_executesql @sql

+0

그래, 고마워, 작동 해. – Yurgen