[SQL] sp_MSforeachdb : 결과 만에 데이터베이스에서 결과를 포함
SQLsp_MSforeachdb : 결과 만에 데이터베이스에서 결과를 포함
나는 간단한 명령으로 아래의 저장 프로 시저 sp_MSforeachdb를 실행하고 있습니다. 내 질문은 적어도 1 기록 명령을 만족가있는 경우에만 데이터베이스를 표시하는 결과를 제한하는 방법입니다 :
여기 내 저장 프로 시저입니다 :
EXECUTE master.sys.sp_MSforeachdb 'USE [?];
IF (EXISTS (SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = ''Tabs''))
BEGIN
SELECT ''?'' as dbname,T.TabName, T.TabPath
FROM Tabs T
WHERE T.TabID IN (
SELECT Distinct TM.TabID
FROM TabModules TM
WHERE mID IN (
...
)
)
ORDER BY T.TabName
END
'
비어 결과를 데이터베이스를 표시하지 않도록 모든 아이디어를 어떻게 (이미지 참조) SP를 수정할 수 있습니까?
해결법
-
==============================
1.음, 첫째, sp_MSforEachDb 사용을 중지. 아, 문제는 (당신이 증명하려면 여기를 참조).
음, 첫째, sp_MSforEachDb 사용을 중지. 아, 문제는 (당신이 증명하려면 여기를 참조).
방법에 대해 :
DECLARE @cmd NVARCHAR(MAX) = N'', @sql NVARCHAR(MAX) = N''; SELECT @cmd += N'IF EXISTS (SELECT 1 FROM ' + QUOTENAME(name) + '.sys.tables WHERE name = N''Tabs'') SET @sql += N''UNION ALL SELECT ''''' + name + ''''',T.TabName FROM ' + QUOTENAME(name) + '.dbo.Tabs AS T WHERE EXISTS ( SELECT 1 FROM ' + QUOTENAME(name) + '.dbo.TabModules AS TM WHERE TM.TabID = T.TabID AND TM.mID IN -- this should probably be exists too ( ... ) ) ''' FROM sys.databases WHERE state = 0 -- assume you only want online databases AND database_id > 4; -- assume you don't want system dbs EXEC sp_executesql @cmd, N'@sql NVARCHAR(MAX) OUTPUT', @sql OUTPUT; SET @sql = STUFF(@sql, 1, 10, '') + N' ORDER BY TabName;'; PRINT @sql; -- this will appear truncated, but trust me, it is not truncated -- EXEC sp_executesql @sql;
당신이 정말로 알 수없는, 별도의 결과 집합의 임의의 수를 원하는 경우에, 변화는 간단하다.
DECLARE @cmd NVARCHAR(MAX) = N'', @sql NVARCHAR(MAX) = N''; SELECT @cmd += N'IF EXISTS (SELECT 1 FROM ' + QUOTENAME(name) + '.sys.tables WHERE name = N''Tabs'') SET @sql += N''SELECT ''''' + name + ''''',T.TabName FROM ' + QUOTENAME(name) + '.dbo.Tabs AS T WHERE EXISTS ( SELECT 1 FROM ' + QUOTENAME(name) + '.dbo.TabModules AS TM WHERE TM.TabID = T.TabID AND TM.mID IN -- this should probably be exists too ( ... ) ) ORDER BY T.TabName; '';' FROM sys.databases WHERE state = 0 -- assume you only want online databases --AND database_id > 4; -- assume you don't want system dbs EXEC sp_executesql @cmd, N'@sql NVARCHAR(MAX) OUTPUT', @sql OUTPUT; PRINT @sql; -- this will appear truncated, but trust me, it is not truncated -- EXEC sp_executesql @sql;
-
==============================
2.당신은 기본적으로 데이터 만이 존재하는 경우 선택 실행하는 또 다른 IF가 필요합니다. 여기에 내가 시험에 무슨 짓을했는지.
당신은 기본적으로 데이터 만이 존재하는 경우 선택 실행하는 또 다른 IF가 필요합니다. 여기에 내가 시험에 무슨 짓을했는지.
DB1에서 :
create table mytesttable(a int) insert mytesttable values(1)
DB2의 경우 :
create table mytesttable(a int)
당신이하지에 반환 결과 DB1하지만, DB2를 원하는 그래서. 다음과 같은 SQL을 사용할 수 있습니다 :
EXECUTE master.sys.sp_MSforeachdb 'USE [?]; IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ''mytesttable'')) BEGIN IF EXISTS (SELECT 1 FROM mytesttable) BEGIN SELECT ''?'' as dbname,T.A FROM mytesttable AS T END END '
이 경우에만 반환 : DB1, 1
from https://stackoverflow.com/questions/20131930/sp-msforeachdb-only-include-results-from-databases-with-results by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL의 카운트 성능 (0) | 2020.07.09 |
---|---|
[SQL] C #을 LINQ에서 구현 RANK OVER SQL 조항 (0) | 2020.07.09 |
[SQL] 어떻게 이동 평균 사용하여 MySQL을 계산합니까? (0) | 2020.07.09 |
[SQL] JSON 데이터 타입의 레코드 중첩 된 배열 쿼리 조합 (0) | 2020.07.09 |
[SQL] 페이스 북은 운영자와 같은 SQL이 FQL 있습니까? (0) | 2020.07.09 |