I'm trying to run a query across multiple databases. Each database is a different customer but I'm querying the same tables across all of them. I want to loop through all the databases (about 100) and put all the results in a table. I've tried a few different ways but I can't quite seem to get it working and it seems like it might be a syntax thing. Below is my code:
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
Error Message: "Msg 102, Level 15, State 1, Line 55 Incorrect syntax near '@DB'."
Any help will be greatly appreciated, thank you!
