2011-01-05 13 views
29

Co jest nie tak z tym stwierdzeniem?Instrukcja SELECT, która przypisuje wartość do zmiennej, nie może być łączona z operacjami pobierania danych.

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 

Wystarczy wyjaśnić odpowiedź (po uzyskaniu w którym błąd został spowodowany), po prostu usunięte @adjustedLow od drugiego select.

Odpowiedz

43

Wartości kolumn z instrukcji SELECT są przypisywane do zmiennych lokalnych @low i @day; wartość @adjustedLow nie jest przypisany do każdej zmiennej i to powoduje problem:

Problemem jest tutaj:

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

Szczegółowe wyjaśnienie i obejścia: 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

dziękuję! ratownik! – Ramy

+0

Cóż, przedstawione obejście problemu nie pozwala na uzyskanie zarówno zestawu wyników, jak i przekazania jednej z wartości do zmiennej. Zasadniczo, jeśli musisz to zrobić (nie w tym przypadku, wiem), to musisz dwukrotnie napisać i uruchomić zapytanie :( –

-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

Nie można użyć select która przypisuje wartości do zmiennych, aby również zwracać dane do użytkownika Poniższy kod będzie działał poprawnie, ponieważ zadeklarowałem 1 zmienną lokalną i ta zmienna jest używana w instrukcji select.

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

Poniższy kod wygeneruje błąd „SELECT, która przypisuje wartość do zmiennej nie muszą być łączone z operacji na danych odzyskiwanie” Ponieważ jesteśmy retriving dane (PolicyHolderAddress) od stołu, ale błąd mówi dane Operacja -retrieval nie jest dozwolona, ​​gdy używasz jakiejś zmiennej lokalnej jako części instrukcji select.

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

powyższy kod można skorygować jak niżej

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

Więc albo usunąć operację odzyskiwania danych, lub dodać dodatkową zmienną lokalną. To rozwiąże błąd.

+0

@Matas Próbuję uzyskać najkrótszy ciąg miasta wraz z jego długością, więc wypróbowany poniżej: 'WYBIERZ GÓRĘ 1 @SHORTEST_CITY = S.CITY, LEN (S.CITY) JAKO DŁUGOŚĆ Z POSTAWIENIA S ZA DŁUGĄ DESKĘ' ' Ale otrzymuję instrukcję' SELECT, która przypisuje wartość do zmiennej nie może być w połączeniu z operacjami pobierania danych. "Zamierzam sortować według długości, nie alfabetycznie, a wszelkie przemyślenia na ten temat: –

+1

@SanKrish, możesz to wypróbować, DECLARE SHORTEST_CITY nvarchar (max) DECLARE LENGTH varchar (100) SELECT TOP 1 SHORTEST_CITY = S.CITY, LENGTH = LEN (S.CITY) Z ZAMÓWIENIA STACJI PRZEZ LEN (S.CITY) DESC; wybierz SHORTEST_CITY wybierz LENGTH – Govind

Powiązane problemy