2013-11-26 2 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 содержит разделенные запятой идентификаторы округа –

+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

Хорошо. Поэтому моя вставка, вероятно, сделает эту работу за вас. Вы уже раскалываете свои CountryIDs в таблицу @t, чтобы это уже удовлетворялось. –

Смежные вопросы