2013-11-26 27 views
1

您好我有一個MS SQL Server 2012中的過程,其中我正在執行一些插入和更新,但在該過程的某些部分中,我使用遊標進行循環插入。沒有使用遊標插入

有人可以幫我做循環插入而不使用光標嗎?

完整代碼如下

(
      @TerritoryName varchar(200), 
      @TerritoryDescription varchar(2000), 
      @TerritoryID int, 
      @CountyIDs varchar(500), 
      @ZipCodeIDs varchar(500) 
      ) 
      AS 

      BEGIN 


      Declare @countyid int,@zipcodeid int,@Target_GeographyTypeID int; 
      DECLARE @t TABLE(idx int primary key identity,id int) 
      DECLARE @tzip TABLE(idx int primary key identity,id int) 
      INSERT INTO @t 
      SELECT item from fn_split(@CountyIDs,',') 


      INSERT INTO @tzip 
      SELECT item from fn_split(@ZipCodeIDs,',') 

      IF(@TerritoryID < 1) 
      BEGIN 
      INSERT INTO Territories(TerritoryName,TerritoryDescription,Active,CreatedDate) 
      VALUES(@TerritoryName,@TerritoryDescription,1,Getdate()) 

      SET @TerritoryID= @@identity 

      END 
      ELSE 

      BEGIN 
      UPDATE Territories 
      SET [email protected], 
      [email protected] 
      WHERE [email protected] 

      END 


      SELECT @Target_GeographyTypeID=GeographyTypeId from GeoGraphyTypes 
      WHERE GeographyTypeName='County' 



      DELETE from Territory_mapping 
      WHERE [email protected] 


      DECLARE db_cursor CURSOR FOR 

      SELECT id 

      FROM @t 

      OPEN db_cursor 

      FETCH NEXT FROM db_cursor INTO @countyid 
      WHILE @@FETCH_STATUS = 0 

      BEGIN 

      if(@countyid > 0) 
      BEGIN 

      INSERT INTO Territory_mapping(TerritoryID,Target_GeographyTypeID,Target_GeographyID,CreatedDate) 
      VALUES(@TerritoryID,@Target_GeographyTypeID,@countyid,GETDATE()) 

      END 

      FETCH NEXT FROM db_cursor INTO @countyid 

      END 



      CLOSE db_cursor 

      DEALLOCATE db_cursor 




      -------------------- Zip Code ----------------------- 
      SELECT @Target_GeographyTypeID=GeographyTypeId from GeoGraphyTypes 
      WHERE GeographyTypeName='Zipcode' 

      DECLARE db_cursor CURSOR FOR 

      SELECT id 

      FROM @tzip 

      OPEN db_cursor 

      FETCH NEXT FROM db_cursor INTO @zipcodeid 
      WHILE @@FETCH_STATUS = 0 

      BEGIN 

      IF(@zipcodeid > 0) 

      BEGIN 

      INSERT INTO Territory_mapping(TerritoryID,Target_GeographyTypeID,Target_GeographyID,CreatedDate) 
      VALUES(@TerritoryID,@Target_GeographyTypeID,@zipcodeid,GETDATE()) 

      END 

      FETCH NEXT FROM db_cursor INTO @zipcodeid 

      END 



      CLOSE db_cursor 

      DEALLOCATE db_cursor 












      RETURN @TerritoryID 

      END 
+0

@CountyID包含逗號分隔的縣ID's –

+1

「@ TerritoryID','@ Target_GeographyTypeID'從哪裏來?從'@ t'表? –

+0

否@T和@Territory是兩者independent.code兩者都低於: –

回答

1

您是否嘗試過這樣的:

INSERT INTO Territory_mapping 
    (TerritoryID,Target_GeographyTypeID,Target_GeographyID,CreatedDate) 
Select @TerritoryID, @Target_Geography, id, GETDATE() 
From @t 
Where id > 0 

注意這純粹是你的代碼的基礎上你提供什麼返工。我不知道其中一些變量是從哪裏來的。

另外,你說countryid是逗號分隔的值列表,但這不是你的代碼如何使用它。我的示例假設(是你的)@countryid(和擴展名,id)是一個單一的值。如果情況並非如此,請更新您的代碼以顯示您如何處理逗號分隔列表。

+0

現在我已經在問題上添加了我的整個代碼。請檢查代碼並提出解決方案 –

+0

好的。所以我的插入可能會爲你做這項工作。您已經將您的CountryID分成了@t表,因此已經被照顧到了。 –