2013-10-29 34 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處理的形式,這可能比使用遊標更強烈。另外,遊標似乎並沒有在這個環節中被提及...以及其他問題 –