Использование цикла while с курсорами SQL?

Я создаю сценарий sql, у меня есть 2 курсора для перебора данных: курсор таблицы и курсор компании. У меня возникают проблемы с объединением курсора компании с использованием циклов while для копирования данных в схему. Мне нужно ответить на следующие вопросы, используя оператор If.

Есть ли в таблице столбец companyID? оператор if, проверяющий идентификатор компании, если да, то скопируйте данные на основе идентификатора компании в курсоре

У меня объявлен @firstLoop

Вот мой конкретный код курсора

DECLARE @firstLoop BIT
SET @firstLoop = true

----------- Cursor specific code starts here ------------
-- company cursor
declare copyCompanyDataCursor CURSOR fast_forward FOR
SELECT ID from #CompanyIDs;

open copyCompanyDataCursor
fetch next from copyCompanyDataCursor into @Company_Id;

WHILE @@FETCH_STATUS = 0
    BEGIN

        declare @processorder int;
        declare @tablename varchar(500);
        -- table cursor

        declare copyTableDataCursor CURSOR fast_forward FOR
        SELECT processorder,tablename from #TableList4 order by processorder;

        open copyTableDataCursor
        fetch next from copyTableDataCursor into @processorder, @tablename;

        while @@FETCH_STATUS = 0
        BEGIN
            SET IDENTITY_INSERT [c365online_script1.dbo.tCompany] OFF

            -- Does the table have a companyID column? if statement checking for company id

            -- if yes then copy data based on companyID in cursor

            -- if no check if this is the first time through company loop and copy all data
            -- if @firstloop company exists look at information schema

                    -- insert into c365online_script1.dbo.tCompany(selec
                    EXEC('INSERT ' + @Destination_Database_Name + '.dbo.' + @tablename + ' SELECT * FROM ' + @Source_Database_Name + '.dbo.' + @tablename + ')')

                    -- company logic


            SET IDENTITY_INSERT [c365online_script1.dbo.tCompany] ON

            FETCH NEXT FROM copyTableDataCursor into @processorder,@tablename;
        END

        close copyTableDataCursor;
        Deallocate copyTableDataCursor;

--INSERT INTO c365online_script1.dbo.tCompany
--SELECT *
--FROM production2.tCompany
--WHERE ISNULL(CompanyID, 0) = 0  -- copy all data where id is equal to zero
--@Destination_Database_Name

--      
        --EXEC(INSERT  + @Destination_Database_Name + '.dbo.' + @tablename + ' SELECT * FROM ' + @Source_Database_Name + '.dbo.' + @tablename + ' WHERE ' + @Source_Database_Name + '.dbo.' + @tablename + '.CompanyID = ' + @Company_Id + ')'      
        SET @firstLoop = false;
        FETCH NEXT FROM copyCompanyDataCursor into @Company_Id;
    END
CLOSE copyCompanyDataCursor;
DEALLOCATE copyCompanyDataCursor;

person user2520671    schedule 29.10.2013    source источник
comment
эээ, а смысл всего этого? Если вы на самом деле пытаетесь продублировать схему, почти наверняка есть встроенные опции...   -  person Clockwork-Muse    schedule 29.10.2013
comment
Цель состоит в том, чтобы уменьшить размер базы данных, создав сценарий, который вы можете использовать для создания уменьшенной базы данных, выбрав только несколько компаний, которые необходимы в данный момент времени. Схема уже скопирована в пустую базу данных, которая мне сейчас нужна. чтобы заполнить его.   -  person user2520671    schedule 29.10.2013
comment
... Я бы честно поместил соответствующие таблицы, которые будут рассматриваться для этого, в их собственную схему, если вы не дублируете все таблицы. Должны быть сценарии, генерируемые по умолчанию, которые будут дублировать таблицы схемы. И, возможно, для содержимого таблицы... может быть. Почему вы дублируете БД таким образом? Обратите внимание, что это фактически не уменьшит размер основной БД, так как у вас останутся все исходные данные.   -  person Clockwork-Muse    schedule 29.10.2013
comment
Мне поставили эту задачу и мне специально сказали сделать это таким образом   -  person user2520671    schedule 29.10.2013
comment
База данных будет меньше, так как вы укажете идентификатор компании в начале сценария и не будете создавать всю базу данных.   -  person user2520671    schedule 29.10.2013


Ответы (1)


Я предлагаю вам заменить оба курсора на цикл while.

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

Для получения статей о SQL Server перейдите по ссылке ниже статьи SQL Server в режиме реального времени.

person rahul    schedule 29.10.2013
comment
Спасибо за предложение, хотя я еще не вынес решения об использовании курсоров, это решение было принято выше. Мне сказали использовать их, но я предложу использовать циклы while. - person user2520671; 29.10.2013
comment
эээ, технически он уже использует цикл while для управления курсорами... Вы правы, что курсоры, как правило, имеют снижение производительности по сравнению с фактической обработкой на основе наборов... однако текущая процедура, похоже, требует некоторой формы RBAR обработка, которая, вероятно, будет более интенсивной, чем использование курсора. Кроме того, курсоры, похоже, не упоминаются в этой ссылке... среди других проблем - person Clockwork-Muse; 29.10.2013