Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server将用户函数结果包含到选择查询中_Sql_Sql Server - Fatal编程技术网

SQL Server将用户函数结果包含到选择查询中

SQL Server将用户函数结果包含到选择查询中,sql,sql-server,Sql,Sql Server,我有这个存储函数 function GetPrevReading( @utility int, @asofdate datetime ) returns decimal(10,5) 此函数使用以下字段从表中返回上一次仪表读数: utility - int date - datetime reading - numeric(18,4) 在此表上使用select时,我希望将日期设置为参数,并从表中获取: Utility Previous Reading (distinct) GetPrev

我有这个存储函数

function GetPrevReading(
@utility int,
@asofdate datetime
) returns decimal(10,5)
此函数使用以下字段从表中返回上一次仪表读数:

utility - int
date - datetime
reading - numeric(18,4)
在此表上使用select时,我希望将日期设置为参数,并从表中获取:

Utility    Previous Reading
(distinct) GetPrevReading(utility from query, @date from parameter)
Utility    Date        Reading
1          2013-10-1   105.6
1          2013-11-1   123.72
2          2013-10-1   226.1
2          2013-10-1   238.18
我希望函数GetPrevReading从当前行获取参数“utility”。 是否可以通过查询来实现这一点,或者我应该创建一个存储过程

例如,以下表格:

Utility    Previous Reading
(distinct) GetPrevReading(utility from query, @date from parameter)
Utility    Date        Reading
1          2013-10-1   105.6
1          2013-11-1   123.72
2          2013-10-1   226.1
2          2013-10-1   238.18
现在,如果我将参数@date设置为2013-10-29,我将得到以下结果:

Utility    PreviousReading
1          105.6
2          226.1

这里,我的函数应该在第一行得到@utility=1和@asofdate='2013-10-29',在第二行得到@utility=2和@asofdate='2013-10-29'。

我是否理解这个问题;该函数为此调用返回

GetPrevReading( 1,2013-10-29) 
返回

1, 105.6
2, 226.1
您想在函数及其结果和基础表之间联接吗?您可以在SQL 2005+中使用连接

试试看。我修复了数据类型中的一些不一致之处,并假设您的最后一行样本数据应该以2013-11-01作为日期。此外,函数的编写方式不是获取以前的读数,而是获取该日期的读数

CREATE TABLE MyTable (
    Utility Int,
    Date Date,
    Reading Decimal(10,5)
  );

INSERT INTO MyTable (Utility, Date, Reading)
VALUES
 (1,'2013-10-01', 105.60),
 (1,'2013-11-01', 123.72),
 (2,'2013-10-01', 226.10),
 (2,'2013-11-01', 238.18);

CREATE FUNCTION dbo.GetPrevReading(
  @utility int,
  @asofdate datetime
)
RETURNS Decimal(10,5)
AS
  BEGIN

    RETURN (
        SELECT TOP 1 Reading
        FROM MyTable
        WHERE Utility = @Utility
          AND Date = @asofdate
        ORDER BY Date DESC
      )
END;


SELECT
  Utility
  ,Date
  ,dbo.GetPrevReading(Utility, Date)
FROM (
  SELECT Utility, Max(Date) Date
  FROM MyTable
  WHERE Date < '2013-10-29'
  GROUP BY Utility
) x;

这是返回单个值的标量UDF吗?等等,为什么表中的实用程序是nvarchar20,函数的输入是int?我的坏,实用程序是int。我改变了,是的,UDF是scalarIs,你的读数是18,4还是10,5?