2011-01-05 9 views
29

Bu ifade yanlıştır? Bir değişkene değer atayan bir SELECT ifadesi, veri alma işlemleriyle birleştirilmemelidir

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 

Sadece, ben sadece ikinci select deyimi @adjustedLow kaldırıldı (hata neden oldu nerede aldıktan sonra) cevap açıklamak için.

cevap

43

SELECT ifadesinden gelen sütun değerleri, @low ve @day yerel değişkenlerine atanmıştır; @adjustedLow değeri herhangi bir değişken içine atanan ve soruna neden değildir:

sorun buradadır:

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

Ayrıntılı açıklama ve geçici çözüm: 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

Teşekkürler! cankurtaran! – Ramy

+0

Sağlanan çözüm, sonuç kümesini almanıza ve değerlerden birini bir değişkene zorlamanıza izin vermez. Temel olarak, eğer bunu yapmanız gerekiyorsa (buradaki durumu değil, biliyorum), sorgunuzu iki kez yazmanız ve çalıştırmanız gerekir :( –

-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

Bir seçme deyimini kullanamazsınız Bu da veri kullanıcıya döndürmek için değişkenlere değer atar Aşağıdaki kod, 1 yerel değişken bildirilmiş ve bu değişkeni select deyiminde kullanıyorum çünkü iyi çalışır.

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

masadan veri (PolicyHolderAddress) retriving fakat Çünkü hata veri diyor "veri alma operasyonları ile kombine edilmemelidir değişken bir değer atar bir SELECT deyimi" hatası atar Aşağıdaki kod Bazı yerel değişkenleri select deyiminin bir parçası olarak kullandığınızda, -retrieval işlemine izin verilmez.

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

Yukarıdaki kod aşağıda gibi düzeltilebilir

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

Yani ya veri alma işlemini kaldırmak veya ekstra yerel değişken eklemek. Bu hatayı çözecektir.

+0

@Matas En kısa şehir dizesini uzunluğuna eklemeye çalışıyorum. 'den SELECT TOP 1 @SHORTEST_CITY = S.CITY, LEN (S.CITY) UZUNLUK DÜZENLEME SIRASINDAN UZUNLUĞU UZUNLUK DÜZENLENMESİNDE; '. Fakat bir değişkene değer atayan bir SELECT ifadesi olmamalı veri-alma işlemleri ile kombine.'.Farklı bir şekilde uzunluğunu sıralamak niyetinde.Onun üzerinde herhangi bir düşünce? –

+1

@SanKrish bunu deneyebilir, DECLARE SHORTEST_CITY nvarchar (max) DECLARE LENGTH varchar (100) SELECT TOP 1 SHORTEST_CITY = S.CITY, LENGTH = LEN (S.CITY) İSTASYONUNDAN SAYAÇ TARAFINDAN LEN (S.CITY) DESC; seçin SHORTEST_CITY seçin UZUNLUK – Govind

İlgili konular