2011-01-05 18 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(获得其中错误是造成后)。 SELECT语句

回答

43

列值分为@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 2011-01-05 19:10:37

+0

那么,提供的解决方法不会让您既获取结果集,又将其中一个值推送给变量。所以基本上,如果你需要做到这一点(不是这里的情况,我知道),那么你必须编写和运行查询两次:( – 2015-10-14 12:36:43

-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 

下面的代码会抛出错误,因为我们retriving从表中的数据(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)作为站长的长度,按长度降序排列;'。 但是我得到一个SELECT语句,它不能将一个值赋给一个变量结合数据检索操作,我打算按字母顺序排序,不是按照字母顺序排列的,有什么想法吗? – 2017-01-31 09:35:13

+1

@SanKrish你可以试试这个,DECLARE SHORTEST_CITY nvarchar(max) DECLARE LENGTH varchar(100) SELECT TOP 1 SHORTEST_CITY = S.CITY,LENGTH = LEN(S.CITY)FROM无线终端S ORDER BY LEN(S.CITY)DESC; 选择SHORTEST_CITY 选择LENGTH – Govind 2017-02-06 08:15:22

相关问题