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.
왜'입니까? – Darka
그것이 동적 SQL을 생성하는 데 사용하는 연결된 서버의 임시 테이블 원인 – Yurgen
yeap 바로 바보 같은 질문. 죄송합니다 – Darka