Использование имен БД в динамическом операторе выбора SQL - PullRequest
0 голосов
/ 24 мая 2018

Извините всех, я относительно новичок в динамическом SQL, и я мог бы сделать с какой-нибудь помощью, пожалуйста?Я пытаюсь сделать цикл запросов между базами данных.

Я могу запустить запрос и вернуть результаты, но он не перемещается между базами данных

--
DECLARE @HUB_Instance VARCHAR(25);
DECLARE cur_collectHubData CURSOR FAST_FORWARD READ_ONLY FOR
SELECT name
FROM sys.databases
WHERE name LIKE '%HUB%'
      AND name NOT IN ( 'HUB_Training', 'HUB_Training_TNHG' );

OPEN cur_collectHubData;

FETCH NEXT FROM cur_collectHubData
INTO @HUB_Instance;

WHILE @@FETCH_STATUS = 0
BEGIN
    DECLARE @sql1 NVARCHAR(2000);
    SET @sql1
       = 'SELECT t1.Company,
       t1.StaffNumber,
       t1.FullName,
       COUNT(t1.FullName) AS NumberOfCases
FROM
(       SELECT tbl_Company.Name AS Company,
           IdCase,
           FullName AS CaseStatus,
           IdUser_Core_Negotiator,
           StaffNumber,
           FullName
    FROM dbo.tbl_PreCallCaseDetails
        LEFT JOIN dbo.tbl_Case
            ON tbl_Case.Id = tbl_PreCallCaseDetails.IdCase
        JOIN dbo.tbl_CaseStatus
            ON tbl_CaseStatus.Id = tbl_Case.IdCaseStatus
        JOIN Core..tbl_User
            ON tbl_User.Id = dbo.tbl_PreCallCaseDetails.IdUser_Core_Negotiator
        JOIN core..tbl_Company 
            ON  tbl_Company.Id = Core..tbl_User.IdCompany
    WHERE IdUser_Core_Negotiator IS NOT NULL
) t1
GROUP BY t1.Company,
         t1.FullName,
         t1.StaffNumber;';

    EXEC sys.sp_executesql @sql1;

    FETCH NEXT FROM cur_collectHubData
    INTO @HUB_Instance;
END;

CLOSE cur_collectHubData;
DEALLOCATE cur_collectHubData;



-- Doesn't loop between databases
DECLARE @HUB_Instance VARCHAR(25);
DECLARE cur_collectHubData CURSOR FAST_FORWARD READ_ONLY FOR
SELECT name
FROM sys.databases
WHERE name LIKE '%HUB%'
      AND name NOT IN ( 'HUB_Training', 'HUB_Training_TNHG' );

OPEN cur_collectHubData;

FETCH NEXT FROM cur_collectHubData
INTO @HUB_Instance;

WHILE @@FETCH_STATUS = 0
BEGIN
    DECLARE @sql1 NVARCHAR(2000);
    SET @sql1
       = N'SELECT t1.Company,
       t1.StaffNumber,
       t1.FullName,
       COUNT(t1.FullName) AS NumberOfCases
FROM
(       SELECT tbl_Company.Name AS Company,
           IdCase,
           FullName AS CaseStatus,
           IdUser_Core_Negotiator,
           StaffNumber,
           FullName
    FROM' + @HUB_Instance + N'.[dbo].tbl_PreCallCaseDetails
        LEFT JOIN' + @HUB_Instance + N'.[dbo].tbl_Case
            ON tbl_Case.Id = tbl_PreCallCaseDetails.IdCase
        JOIN' + @HUB_Instance + N'.tbl_CaseStatus
            ON tbl_CaseStatus.Id = tbl_Case.IdCaseStatus
        JOIN Core..tbl_User
            ON tbl_User.Id = dbo.tbl_PreCallCaseDetails.IdUser_Core_Negotiator
        JOIN core..tbl_Company 
            ON  tbl_Company.Id = Core..tbl_User.IdCompany
    WHERE IdUser_Core_Negotiator IS NOT NULL
) t1
GROUP BY t1.Company,
         t1.FullName,
         t1.StaffNumber;';

    EXEC sys.sp_executesql @sql1;

1 Ответ

0 голосов
/ 24 мая 2018

Ваш второй курсор не имеет FETCH NEXT или END.Вы также не CLOSE или DEALLOCATE курсор.Как указал Шон , В каждом динамическом sql

DECLARE @HUB_Instance VARCHAR(25);
DECLARE cur_collectHubData CURSOR FAST_FORWARD READ_ONLY FOR
SELECT name
FROM sys.databases
WHERE name LIKE '%HUB%'
      AND name NOT IN ( 'HUB_Training', 'HUB_Training_TNHG' );

OPEN cur_collectHubData;

FETCH NEXT FROM cur_collectHubData
INTO @HUB_Instance;

WHILE @@FETCH_STATUS = 0
BEGIN
    DECLARE @sql1 NVARCHAR(2000);
    SET @sql1
       = N'SELECT t1.Company,
       t1.StaffNumber,
       t1.FullName,
       COUNT(t1.FullName) AS NumberOfCases
FROM
(       SELECT tbl_Company.Name AS Company,
           IdCase,
           FullName AS CaseStatus,
           IdUser_Core_Negotiator,
           StaffNumber,
           FullName
    FROM ' + @HUB_Instance + N'.[dbo].tbl_PreCallCaseDetails
        LEFT JOIN ' + @HUB_Instance + N'.[dbo].tbl_Case
            ON tbl_Case.Id = tbl_PreCallCaseDetails.IdCase
        JOIN ' + @HUB_Instance + N'.tbl_CaseStatus
            ON tbl_CaseStatus.Id = tbl_Case.IdCaseStatus
        JOIN Core..tbl_User
            ON tbl_User.Id = dbo.tbl_PreCallCaseDetails.IdUser_Core_Negotiator
        JOIN core..tbl_Company 
            ON  tbl_Company.Id = Core..tbl_User.IdCompany
    WHERE IdUser_Core_Negotiator IS NOT NULL
) t1
GROUP BY t1.Company,
         t1.FullName,
         t1.StaffNumber;';

    EXEC sys.sp_executesql @sql1;
    --added everything below this line
    FETCH NEXT FROM cur_collectHubData
    INTO @HUB_Instance;
END;

CLOSE cur_collectHubData;
DEALLOCATE cur_collectHubData;
* 1011 пропущен пробел перед каждым экземпляром @HB_Instance. Однако я бы предложил использовать QUOTENAME () вокруг этих табличных переменных просто для хорошей меры.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...