繁体   English   中英

使用带有SQL游标的while循环?

[英]Using a while loop with SQL cursors?

我正在创建一个sql脚本,我有2个游标可通过表游标和公司游标遍历数据。 我在使用while循环将公司光标放在一起以将数据复制到架构时遇到问题,我需要使用If语句回答以下问题

该表是否包含companyID列? if语句检查公司ID(如果是),然后根据游标中的companyID复制数据

我有一个@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;

我建议您将两个CURSORS都替换为while循环。

SQL Server中的CURSORS成本性能非常差,而用While循环替换为临时表肯定会提高性能,并且您必须编写更轻松的编码类型。

有关SQL Server的文章,请查看以下链接SQL Server实时文章

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM