2017-12-07 16 views
0

여러 데이터베이스에서 쿼리를 실행하려고합니다. 각 데이터베이스는 다른 고객이지만 모든 테이블에서 동일한 테이블을 쿼리하고 있습니다. 모든 데이터베이스 (약 100)를 반복하고 모든 결과를 테이블에 넣고 싶습니다. 몇 가지 방법을 시도했지만 꽤 작동하지 않는 것 같아서 구문 일 수도 있습니다.DB 간 쿼리

IF OBJECT_ID('KW.dbo.Result') IS NOT NULL DROP TABLE KW.dbo.Result; 

SELECT name as DBName, ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY name) AS RNo 
INTO #DBName 
FROM sys.databases 
WHERE name LIKE 'Customer%' 
ORDER BY name; 

SELECT * FROM #DBName 

DECLARE @sql varchar; 

SET @sql = N'SELECT bh.ID, 
b.LINE AS Line#, 
c.State, 
bh.ZIP, 
REPLACE(p.Phone, '-', '') AS Phone, 
cc.COMPANY_NAME, 
b.Amount 
INTO KW.dbo.Result 
FROM dbo.Customer c 
    LEFT JOIN dbo.Change ch ON ch.CIDNo = c.CIDNo 
    LEFT JOIN dbo.Provider p ON p.PIDNo = ch.PIDNo 
    LEFT JOIN dbo.BossHead bh ON bh.CHIDNo = ch.CHIDNo 
    LEFT JOIN dbo.Bills b ON b.BIDNo = bh.BIDNo 
    LEFT JOIN dbo.PartnerTerms pt ON pt.BIdNO = b.BIdNo 
    LEFT JOIN dbo.CompanyCode cc ON cc.CompanyCode = pt.CompanyCode 
WHERE REPLACE(p.Phone, '-', '') IN 
(
    SELECT * 
    FROM KW.dbo.PhoneNumbers 
) 
     AND bh.CreateDate BETWEEN "09-01-2016" AND "10-01-2017" 
     AND pt.CompanyCode IS NOT NULL 
ORDER BY 1'; 

DECLARE @DB varchar; 

DECLARE @i int; 

BEGIN TRANSACTION; 

SET @i = 1; 

    WHILE @i <= (SELECT MAX(RNo) FROM #DBName) 

     BEGIN 

      SET @DB = (SELECT DBName FROM #DBName WHERE RNo = @i) 

      USE @DB; 

      EXECUTE sp_executesql @sql 

      SET @i = @i + 1 

     END 

COMMIT TRANSACTION; 

GO 

오류 메시지 : 다음은 내 코드입니다. "메시지 102, 수준 15, 상태 1, 줄 55 근처의 구문이 잘못되었습니다 '@DB'"

도움을 주시면 감사하겠습니다.

+0

게시물을 수정하고 오류 메시지를 제공하거나 문제가 무엇인지 설명하십시오. 나는 왜 사람들이 이것을 할 수 없는지 이해하지 못합니다. 코드를 보면 어디에도 삽입 된 것을 볼 수 없습니다. 그게 문제 야? –

+0

코드를 실행할 때 어떤 결과가 발생합니까? – pabrams

+0

이 특정 시도에 대해 "메시지 102, 수준 15, 상태 1, 줄 55 '@DB'근처의 구문이 잘못되었습니다." 그것을 포함하지 않아서 죄송합니다. – Kush

답변

0

변수를 사용하여 테이블을 전환 할 수 없습니다. 수행 할 수있는 작업은 정규화 된 데이터베이스와 테이블 이름을 사용하여 동시에 모든 데이터베이스를 탐색하는 동적 쿼리를 만드는 것입니다. 쿼리 당신이 원하는 것을 할 때까지, 그와

Use master 

Select top(1) case when Row_Number() over (order by d.name) = 1 then '' else 
'union ' end + 'select c.name from ' + quotename(d.name) +'.' +'.[dbo].[Customer]' 
From sys.databases d 
Order by d.name 

일 상위 1을 제거하고 모든 데이터베이스에 대한 모든 쿼리를 실행 :

는 쿼리를 생성하는 쿼리를 만듭니다.