2012-10-18 69 views
0

我有一个使用游标将数据插入到我的数据库的查询。奇怪的是查询第一次运行(SSMS> Execute),但是如果我第二次运行它,带有游标的部分不会执行。TSQL光标的结果不一致

但是 - 如果我然后打'调试'我可以调试和整个查询执行得很好。在此之后,它再次正常工作,然后再次只执行第一个插入脚本。

我试过FAST_FORWARD,提到here但这似乎并不能解决问题。有什么建议么?

/** Declarations **************************************************/ 
DECLARE @TemplateFileName varchar(200) 
DECLARE @TemplatePreviewFileName varchar(200) 
DECLARE @TemplateId int 
DECLARE @CompanyId int 
DECLARE CompanyCursor cursor FAST_FORWARD FOR SELECT [CmpId] from SetCompany 
/******************************************************************/ 

/** Set template name here ****************************************/ 
SET @TemplateFileName   = 'Template_2' 
SET @TemplatePreviewFileName = 'Template_2' 
/******************************************************************/ 

/******************************************************************/ 
INSERT INTO ... etc 
SET @TemplateId = @@IDENTITY; 
Open CompanyCursor 

WHILE @@FETCH_STATUS = 0 
    BEGIN  
     IF(@CompanyId IS NOT NULL) 
     BEGIN 
      PRINT 'Adding template ' + @TemplateFileName + ' with id ' + convert(varchar, @TemplateId) + ' to company ' + convert(varchar, @CompanyId); 
      INSERT INTO .... etc 
      PRINT 'OK'; 
     END 
     Fetch NEXT FROM CompanyCursor INTO @CompanyId 
END 
CLOSE CompanyCursor; 
DEALLOCATE CompanyCursor; 

运行 '第一' 的时候,我得到:

(1 row(s) affected) 
Adding template Template_2.frx with id 2272 to company 10 

(1 row(s) affected) 
OK 
Adding template Template_2.frx with id 2272 to company 11 

(1 row(s) affected) 
OK 
Adding template Template_2.frx with id 2272 to company 12 

(1 row(s) affected) 
OK 
Adding template Template_2.frx with id 2272 to company 13 

(1 row(s) affected) 
OK 
Adding template Template_2.frx with id 2272 to company 14 

(1 row(s) affected) 
OK 

第二次,只有这个:

(1 row(s) affected) 

事实上,光标内插入未运行。

+0

更好的解决方案:完全避免杂乱的那个光标! :-) –

+0

@marc_s - 你如何建议我这样做? –

+0

只是一个'INSERT INTO ..... SELECT ..... FROM .....' - 根本不需要光标 –

回答

3

Open CompanyCursor 

添加

FETCH NEXT FROM CompanyCursor 
INTO @CompanyId 
+0

谢谢!这解决了它。但为什么它第一次运行? –