为变量赋值的SELECT语句不能与数据检索操作结合使用

Ram*_*amy 30 sql-server sql-server-2008

这个陈述有什么问题?

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
Run Code Online (Sandbox Code Playgroud)

只是为了解释答案(在得到错误的地方之后),我只是从第二个select语句中删除了@adjustedLow.

Mar*_*icz 46

SELECT语句中的列值分配给局部变量@low@day局部变量; 该@adjustedLow值未分配给任何变量,它会导致问题:

问题出在这里:

select 
    top 1 @low = low
    , @day = day
    , @adjustedLow  -- causes error!
--select high
from 
    securityquote sq
...
Run Code Online (Sandbox Code Playgroud)

详细说明和解决方法:SQL Server错误消息 - 消息141 - 为变量赋值的SELECT语句不能与数据检索操作组合使用.


Gov*_*ind 14

您不能使用为变量赋值的select语句也将数据返回给用户以下代码可以正常工作,因为我声明了1个局部变量,并且该变量在select语句中使用.

 Begin
    DECLARE @name nvarchar(max)
    select @name=PolicyHolderName from Table
    select @name
    END
Run Code Online (Sandbox Code Playgroud)

下面的代码将抛出错误"为变量赋值的SELECT语句不能与数据检索操作结合"因为我们正在从表中重新获取数据(PolicyHolderAddress),但是错误说当你不允许数据检索操作时使用一些局部变量作为select语句的一部分.

 Begin
    DECLARE @name nvarchar(max)
    select 
       @name = PolicyHolderName,
       PolicyHolderAddress 
    from Table
 END
Run Code Online (Sandbox Code Playgroud)

以上代码可以如下修改,

Begin
    DECLARE @name nvarchar(max)
    DECLARE @address varchar(100)
    select 
       @name = PolicyHolderName,
       @address = PolicyHolderAddress 
    from Table
END
Run Code Online (Sandbox Code Playgroud)

因此要么删除数据检索操作,要么添加额外的局部变量.这将解决错误.