2011-01-05 10 views
29

이 문이 잘못되었습니다. 변수에 값을 할당하는 SELECT 문을 데이터 검색 작업과 결합해서는 안됩니다

ALTER Function [InvestmentReturn].[getSecurityMinLowForPeriod](@securityid int, 
    @start datetime, 
    @end datetime) 
returns xml 
begin 

declare @results varchar(500) 
declare @low int 
declare @adjustedLow int 
declare @day varchar(10) 

if @end is null 
begin 
    set @end = getdate() 
end 
set @adjustedLow = (select min(adjLow) 
         from (
          select Low * [InvestmentReturn].[fn_getCorporateActionSplitFactor](isq.securityid, @start, convert(varchar,day, 111)) as adjLow 
          from 
           securityquote isq 
          where isq.securityid = @securityid and isq.day >= convert(varchar(10), @start, 111) and convert(varchar(10), @end, 111) >= isq.day 
          and low != -1 
          ) as x) 
select 
    top 1 @low = low 
    , @day = day 
    , @adjustedLow 
--select high 
from 
    securityquote sq 
where 
    day >= convert(varchar(10), @start, 111) and convert(varchar(10), @end, 111) >= day 
    and securityid = @securityid and low != -1 
order by low asc 

    set @results= '<results type="debug_min">' 
    set @results = @results + '<periodStart>' + coalesce(cast(@start as varchar(20)), 'NULL') + '</periodStart>' 
    set @results = @results + '<periodEnd>' + coalesce(cast(@end as varchar(20)), 'NULL') + '</periodEnd>' 
    set @results = @results + '<securityID>' + coalesce(cast(@securityID as varchar(10)), 'NULL') + '</securityID>' 
    set @results = @results + '<periodMin>' + coalesce(cast(@low as varchar(10)), '-11111') + '</periodMin>' 
    set @results = @results + '<coraxAdjustedPeriodMin>' + coalesce(cast(@adjustedLow as varchar(10)), '-11111') + '</coraxAdjustedPeriodMin>' 
    set @results = @results + '<dayMinOcurred>' + coalesce(@day, 'NULL') + '</dayMinOcurred>' 
    set @results = @results + '</results>' 

return @results 

는 그냥 단순히 두 번째 select 문에서 @adjustedLow을 제거 (오류가 발생 된 곳 점점 후) 답을 설명합니다.

답변

43

SELECT 문에서의 열 값은 @low@day 로컬 변수에 할당됩니다. @adjustedLow 값은 임의의 변수에 할당하고이 문제가 발생되지 않습니다

문제는 여기에 있습니다 :

select 
    top 1 @low = low 
    , @day = day 
    , @adjustedLow -- causes error! 
--select high 
from 
    securityquote sq 
... 

자세한 설명과 해결 방법 : SQL Server Error Messages - Msg 141 - A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operations.

+0

감사합니다. 생명의 은인! – Ramy

+0

글쎄, 제공된 해결 방법은 결과 집합을 가져오고 값 중 하나를 변수로 푸시하지 못하게합니다. 그래서 기본적으로, 당신이 이것을 할 필요가 있다면 (내가 아는 경우는 아닙니다.) 그러면 쿼리를 두 번 쓰고 실행해야합니다 : ( –

-4
declare @cur cursor 
declare @idx int  
declare @Approval_No varchar(50) 

declare @ReqNo varchar(100) 
declare @M_Id varchar(100) 
declare @Mail_ID varchar(100) 
declare @temp table 
(
val varchar(100) 
) 
declare @temp2 table 
(
appno varchar(100), 
mailid varchar(100), 
userod varchar(100) 
) 


    declare @slice varchar(8000)  
    declare @String varchar(100) 
    --set @String = '1200096,1200095,1200094,1200093,1200092,1200092' 
set @String = '20131' 


    select @idx = 1  
     if len(@String)<1 or @String is null return  

    while @idx!= 0  
    begin  
     set @idx = charindex(',',@String)  
     if @idx!=0  
      set @slice = left(@String,@idx - 1)  
     else  
      set @slice = @String 

      --select @slice  
      insert into @temp values(@slice) 
     set @String = right(@String,len(@String) - @idx)  
     if len(@String) = 0 break 


    end 
    -- select distinct(val) from @temp 


SET @cur = CURSOR FOR select distinct(val) from @temp 


--open cursor  
OPEN @cur  
--fetchng id into variable  
FETCH NEXT  
    FROM @cur into @Approval_No 

     -- 
    --loop still the end  
    while @@FETCH_STATUS = 0 
    BEGIN 


select distinct(Approval_Sr_No) as asd, @ReqNo=Approval_Sr_No,@M_Id=AM_ID,@Mail_ID=Mail_ID from WFMS_PRAO,WFMS_USERMASTER where WFMS_PRAO.AM_ID=WFMS_USERMASTER.User_ID 
and [email protected]_No 

    insert into @temp2 values(@ReqNo,@M_Id,@Mail_ID) 

FETCH NEXT  
     FROM @cur into @Approval_No  
end 
    --close cursor  
    CLOSE @cur  

select * from @tem 
12

당신은 SELECT 문을 사용할 수 없습니다를 변수에 값을 할당하여 사용자에게 데이터를 반환합니다. 아래 코드는 1 개의 로컬 변수를 선언했으며 해당 변수가 select 문에 사용 되었기 때문에 제대로 작동합니다.

Begin 
    DECLARE @name nvarchar(max) 
    select @name=PolicyHolderName from Table 
    select @name 
    END 

우리는 테이블에서 데이터 (PolicyHolderAddress를) 가져 오는 중 오류,하지만 때문에 오류가 데이터를 말한다 "데이터 검색 작업과 함께 사용할 수 없습니다해야 변수 에 값을 할당하는 SELECT 문을"오류가 발생합니다 아래의 코드 select 문에서 일부 로컬 변수를 사용하는 경우에는 --retrieval 연산을 사용할 수 없습니다.

Begin 
    DECLARE @name nvarchar(max) 
    select 
     @name = PolicyHolderName, 
     PolicyHolderAddress 
    from Table 
END 

다음은 위의 코드는 다음과 같이 수정 될 수

,
Begin 
    DECLARE @name nvarchar(max) 
    DECLARE @address varchar(100) 
    select 
     @name = PolicyHolderName, 
     @address = PolicyHolderAddress 
    from Table 
END 

그래서 어느 데이터 복구 동작을 제거하거나 추가 지역 변수를 추가한다. 이렇게하면 오류가 해결됩니다.

+0

@Matas 그 길이와 함께 가장 짧은 도시 문자열을 얻으려고합니다. 그래서 시도했습니다. 'SELECT TOP 1 @SHORTEST_CITY = S.CITY, LEN (S.CITY) SESSION SESSION by LENGTH DESC;. 하지만 변수에 값을 할당하는 SELECT 문은 알파벳순이 아닌 길이로 정렬 할 생각입니다. 어떤 생각이 있니? –

+1

@SanKrish이 시도해 볼 수 있습니다. DECLARE SHORTEST_CITY nvarchar (최대) DECLARE LENGTH DECLARE LENGTH varchar (100) SELECT TOP 1 SHORTEST_CITY = S.CITY, LEN (S.CITY) LEN (S.CITY) DESC BY 주문 : 선택 SHORTEST_CITY 길이를 선택하십시오. – Govind

관련 문제