2013-11-20 4 views
0

이 쿼리 작성기를 지원하기 위해이 함수를 만들었습니다. 이 함수를 테스트 할 때 다음과 같은 오류가 발생합니다.SQL 커서 검색 오류

커서 가져 오기 : INTO 목록에 선언 된 변수의 개수가 선택한 열의 개수와 일치해야합니다. 어쩌면 누군가가 나를 바로 잡을 수 있거나 내가 여기서 잘못하고있는 것을 말해 줄 수 있습니까?

USE [TestDB] 
GO 
/****** Object: UserDefinedFunction [dbo].[Acc_Query_CustID] 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

    Alter FUNCTION [Acc_Query_CountryData] 
(
@Service_ID int --, @Postal_Start varchar(8). @Postal_Stop varchar(8), @AdrID int,  Type nvarchar(50), @Alias nvarchar(255)) 
      RETURNS nvarchar(800) 
    AS 
    BEGIN 
-- Declare the return variable here 
declare @Query nvarchar(800) 
set @Query = '' 
declare @country nvarchar(255) 
declare @postal_SP nvarchar(255) 
declare @postal_ST nvarchar(255) 
declare @adrID int 
declare @type nvarchar(50) 
declare @alias nvarchar(255) 
declare @postalQuery nvarchar(255) 
declare @TypeExcl bit 
declare @AliasExcl bit 
declare @AdridExcl bit 
---------------------------------------------------  
declare Accountring_Country1Cursor Cursor for 
     select Country from dbo.Accounting_Country1 where Service_ID = @Service_ID   
OPEN Accountring_Country1Cursor 
FETCH NEXT FROM Accountring_Country1Cursor 
INTO @country 
WHILE @@FETCH_STATUS = 0 
BEGIN 
set @postalQuery= ' AND (Country =' [email protected]    
FETCH NEXT FROM Accountring_Country1Cursor 
INTO @country 
--------------------------------------------------- 
--------------------POSTAL 
    declare Accounting_PostalCursor Cursor for 
    select POSTAL_START, isnull(POSTAL_STOP,'') as POSTAL_STOP from dbo.Accounting_Postal where Service_ID = @Service_ID and Country_ID = @country 
    OPEN Accounting_PostalCursor 
    FETCH NEXT FROM Accounting_PostalCursor 
    INTO @postal_SP, @postal_ST 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     set @Query= @Query + ' AND (Postal '+ @postal_ST    
     FETCH NEXT FROM Accounting_PostalCursor 
     INTO @postal_SP, @postal_SP 
    END 
    CLOSE Accounting_PostalCursor 
    DEALLOCATE Accounting_PostalCursor 
    ------------------TYPE 
    declare Accounting_TypeCursor Cursor for 
    select Type from dbo.Accounting_Type where Service_ID = @Service_ID and Country_ID = @country 
    OPEN Accounting_PostalCursor 
    FETCH NEXT FROM Accounting_TypeCursor 
    INTO @type 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     set @Query= @Query + ' AND (Type '+ (case(@TypeExcl) when 1 then ' NOT LIKE ' else ' LIKE ' end) + @type     
     FETCH NEXT FROM Accounting_TypeCursor 
     INTO @type 
    END 
    CLOSE Accounting_TypeCursor 
    DEALLOCATE Accounting_TypeCursor 
    -- <ADRP> <ADRD>.Adrid = 
    ------------------ALIAS 
    declare Accounting_AliasCursor Cursor for 
    select Alias from dbo.Accounting_Alias where Service_ID = @Service_ID and Country_ID = @country 
    OPEN Accounting_PostalCursor 
    FETCH NEXT FROM Accounting_TypeCursor 
    INTO @alias 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     set @Query= @Query + ' AND (alias '+ (case(@AliasExcl) when 1 then ' NOT LIKE ' else ' LIKE ' end) + @alias      
     FETCH NEXT FROM Accounting_AliasCursor 
     INTO @alias 
    END 
    CLOSE Accounting_AliasCursor 
    DEALLOCATE Accounting_AliasCursor 

    ------------------ ADDRESSID 
    declare Accounting_AdridCursor Cursor for 
    select AdrID from dbo.Accounting_AdrID where Service_ID = @Service_ID and Country_ID = @country 
    OPEN Accounting_AdridCursor 
    FETCH NEXT FROM Accounting_AdridCursor 
    INTO @adrid 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     set @[email protected] + ' AND (adrid '+ (case(@adridExcl) when 1 then ' NOT LIKE ' else ' LIKE ' end) + @adrid  

     FETCH NEXT FROM Accounting_AdridCursor 
     INTO @adrid 
    END 
    CLOSE Accounting_AdridCursor 
    DEALLOCATE Accounting_AdridCursor 
--------------------------------------------------- 
---------------------------------------------------    
END 
CLOSE Accountring_Country1Cursor 
DEALLOCATE Accountring_Country1Cursor    
RETURN @Query 

END 

답변

1

FETCH INTO 절의 컬럼 수는 커서를 작성하는 데 사용 된 SQL 문의 정의 된 컬럼 수와 동일해야합니다.

declare Accountring_Country1Cursor Cursor for 
select Country 
from dbo.Accounting_Country1 
where Service_ID = @Service_ID 
+0

방금 ​​위의 쿼리를 업데이트 한 결과 여전히 동일한 오류가 발생하는 것으로 보입니다. Cursorfetch : INTO 목록에 선언 된 변수의 수가 선택한 열의 변수와 일치해야합니다. – MishMish

0

확인 행 :

OPEN Accounting_PostalCursor 

는 하나의 열을 검색하므로,

FETCH NEXT FROM Accountring_Country1Cursor 
INTO @country, @isDelivery, @exclude 

또는 재정 커서 : 그래서 Accountring_Country1Cursor 대해 지정 (먼저 선언) 2 개 이상의 변수를한다 "Accounting_TypeCursor"를 선언하십시오.

declare Accounting_TypeCursor Cursor for 
select Type 
from dbo.Accounting_Type 
where Service_ID = @Service_ID and Country_ID = @country 
"Accounting_AliasCursor"와

OPEN Accounting_PostalCursor

같은 :

는 그들이 다른 커서를 엽니 다.