Должен объявить скалярную переменную, даже если она объявлена

Tom спросил: 13 октября 2017 в 06:22 в: sql-server

Я создал скрипт для динамического создания таблиц на основе данных и вставки данных в эти таблицы. Сценарий содержит вызовы запросов к связанному серверу, поскольку исходная и целевая таблицы находятся на разных серверах баз данных.

При выполнении хранимой процедуры я получаю следующую ошибку

Необходимо объявить скалярная переменная"@startYear".

Ниже приведена хранимая процедура. Кто-нибудь может сказать мне, в чем проблема?

CREATE PROCEDURE processFinancialStatementIds 
AS
BEGIN
    set nocount on    declare @startYear int, @startQuarter int, @sql nvarchar(max), @tableName varchar(50);
    set @startYear = 2000;
    set @startQuarter = 1;    while(@startYear < 2018)
    begin
        set @startQuarter = 1;        while(@startQuarter < 5)
        begin
            set @tableName = 'FinData' + cast(@startYear as varchar) + '_' + cast(@startQuarter as varchar);
            set @sql = '
            EXECUTE (''USE CoreReferenceStaging;drop table [dbo].[' + @tableName + '];'') AT [GBIPS-I-DB324D];
            EXECUTE (''USE CoreReferenceStaging;create table [dbo].[' + @tableName + '] ( calendarYear int, calendarQuarter int, companyid bigint not null, dataitemid bigint not null, dataitemvalue numeric(28,6), fiscalyear int, fiscalquarter int, periodenddate datetime, filingdate datetime, latestforfinancialperiodflag bit, latestfilingforinstanceflag bit );'') AT [GBIPS-I-DB324D]
            EXECUTE (''USE CoreReferenceStaging;            
                insert into [dbo].[' + @tableName + '] select fp.calendarYear, fp.calendarQuarter, fp.companyid, fd.dataitemid, fd.dataitemvalue, fp.fiscalyear, fp.fiscalquarter, fi.periodenddate, fi.filingdate, fi.latestforfinancialperiodflag, fi.latestfilingforinstanceflag
                    from [Xpressfeed_dev].[dbo].[ciqFinPeriod] fp
                    inner join [Xpressfeed_dev].[dbo].[ciqFinInstance] fi on fi.financialPeriodId = fp.financialPeriodId
                    inner join [Xpressfeed_dev].[dbo].[ciqFinInstanceToCollection] fc on fc.financialInstanceId = fi.financialInstanceId
                    inner join [Xpressfeed_dev].[dbo].[ciqFinCollection] c on c.financialCollectionId = fc.financialCollectionId
                    inner join [Xpressfeed_dev].[dbo].[ciqFinCollectionData] fd on fd.financialCollectionId = c.financialCollectionId
                    where YEAR(fi.periodenddate) = cast(@startYear as varchar) and  DATEPART( quarter,fi.periodenddate) = cast(@startQuarter as varchar '')  AT [GBIPS-I-DB324D]'
            --print (@sql);
            EXEC sp_executesql @sql            set @startQuarter += 1
        end        set @startYear += 1;
    end
end

Модифицированный запрос

BEGIN
    set nocount on--declare @startYear int, @startQuarter int, @sql nvarchar(max), @tableName varchar(50);
--set @startYear = 2000;
--set @startQuarter = 1;declare @startyear int = 2000
declare @startQuarter int = 1
declare @sql nvarchar(max)
declare @tableName varchar(50)while @startYear < 2018
    begin
        set @startQuarter = 1;        while @startQuarter < 5
        begin
            set @tableName = 'FinData' + cast (@startYear as varchar) + '_' + cast(@startQuarter as varchar);
            set @sql = '
            EXECUTE (''USE CoreReferenceStaging;drop table [dbo].[' + @tableName + '];'') AT [GBIPS-I-DB324D];
            EXECUTE (''USE CoreReferenceStaging;create table [dbo].[' + @tableName + '] ( calendarYear int, calendarQuarter int, companyid bigint not null, dataitemid bigint not null, dataitemvalue numeric(28,6), fiscalyear int, fiscalquarter int, periodenddate datetime, filingdate datetime, latestforfinancialperiodflag bit, latestfilingforinstanceflag bit );'') AT [GBIPS-I-DB324D]
            EXECUTE (''USE CoreReferenceStaging;            
                insert into [dbo].[' + @tableName + '] select fp.calendarYear, fp.calendarQuarter, fp.companyid, fd.dataitemid, fd.dataitemvalue, fp.fiscalyear, fp.fiscalquarter, fi.periodenddate, fi.filingdate, fi.latestforfinancialperiodflag, fi.latestfilingforinstanceflag
                    from [Xpressfeed_dev].[dbo].[ciqFinPeriod] fp
                    inner join [Xpressfeed_dev].[dbo].[ciqFinInstance] fi on fi.financialPeriodId = fp.financialPeriodId
                    inner join [Xpressfeed_dev].[dbo].[ciqFinInstanceToCollection] fc on fc.financialInstanceId = fi.financialInstanceId
                    inner join [Xpressfeed_dev].[dbo].[ciqFinCollection] c on c.financialCollectionId = fc.financialCollectionId
                    inner join [Xpressfeed_dev].[dbo].[ciqFinCollectionData] fd on fd.financialCollectionId = c.financialCollectionId
                    where YEAR(fi.periodenddate) = cast(@startYear as varchar) and  DATEPART( quarter,fi.periodenddate) = cast(@startQuarter as varchar '')  AT [GBIPS-I-DB324D]'
            --print (@sql);
            EXEC sp_executesql @sql            set @startQuarter += 1
        end        set @startYear += 1;
    end
end

0 ответов