2013-10-29 35 views
0

我正在创建一个sql脚本,我有2个游标循环通过数据表游标和公司游标。 我有把公司光标问题放在一起使用while循环将数据复制到架构 我需要回答使用If声明对SQL游标使用while循环?

以下问题是否表有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 
[email protected]_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; 
+0

呃,究竟是这一切的呢?如果你实际上试图复制一个模式,几乎可以肯定内置选项...... –

+0

其目的是通过生成一个脚本来减小数据库的大小,你可以通过选择一个脚本来生成一个缩小的数据库很少有公司在特定的时间需要。架构已被复制到一个空数据库中,现在我需要填充它。 – user2520671

+0

......如果你没有复制所有的表格,我会把相关表格放在他们自己的模式中。应该有默认生成的脚本,它们将复制模式表。也可能用于表格内容......也许。 _为什么你这样复制数据库?请注意,这实际上并不会减少主数据库的大小,因为您仍然拥有所有原始数据。 –

回答

0

我建议你更换两个带while循环的CURSORS。

Cursor在SQL Server中的性能非常差,而用While循环替换临时表会使用While循环,这肯定会提高性能和编写更简单的编码类型。

有关SQL Server的文章,请查看以下链接 SQL Server real time articles

+0

感谢您的建议,虽然我还没有做出使用游标的判断,决定已经提高了。我被告知要使用它们,但会建议使用while循环。 – user2520671

+0

呃,他在技术上已经使用'while'循环来驱动游标......你说得对,与实际的基于集合的处理相比,游标往往会有性能损失...但是,目前的程序似乎需要一些RBAR处理的形式,这可能比使用游标更强烈。另外,游标似乎并没有在这个环节中被提及...以及其他问题 –