1

SQL 编程新手,我有这个很好用的函数:

(
@clientId AS int
)
RETURNS NVARCHAR(50)
AS
BEGIN
declare @result nvarchar(50);
declare @lastDate Date;
declare @dateBefore Date;
declare @count float;
set @count = (select  MAX(A1c)-MIN(A1c) as change from
(select A1c from 
( select top 2 * from vw_MasterView where clientId = @clientId order by vw_masterView.LastVisitDate desc  ) as vw
group by A1c) as hh);
RETURN @count
end;

因为我将重复这个函数来计算 MasterView 中的其他列;我想将 A1c 更改为变量,如下所示:

(
@clientId AS int,
@lab AS nvarchar(50)
)
RETURNS NVARCHAR(50)
AS
BEGIN
declare @result nvarchar(50);
declare @lastDate Date;
declare @dateBefore Date;
declare @count float;
set @count = (select  MAX(@lab)-MIN(@lab) as change from
(select @lab from 
( select top 2 * from vw_MasterView where clientId = @clientId order by vw_masterView.LastVisitDate desc  ) as vw
group by @lab) as hh);
RETURN @count
end;

我收到以下错误:

Msg 164, Level 15, State 1, Procedure fn_changeA1c, Line 22
Each GROUP BY expression must contain at least one column that is not an outer reference.
Msg 8155, Level 16, State 2, Procedure fn_changeA1c, Line 22
No column name was specified for column 1 of 'hh'.

提前致谢。

4

1 回答 1

0

您需要使用存储过程而不是函数。

create procedure myprocedure
    @clientId AS int,
    @lab AS nvarchar(50)
    AS
BEGIN
    declare @result nvarchar(50);
    declare @lastDate Date;
    declare @dateBefore Date;
    declare @count float;
    declare @sql nvarchar(500);
    set @sql = 'select  MAX(' + @lab + ')-MIN(' + @lab + ') as change from
    (select ' + @lab + ' from 
    ( select top 2 * from vw_MasterView where clientId = ' + convert(nvarchar, @clientId) + ' order by    vw_masterView.LastVisitDate desc  ) as vw
    group by ' + @lab + ') as hh';
    execute sp_executesql @sql;
end;
于 2012-05-26T22:53:57.410 回答