T-SQL中的NumbersTable()函数

时间:2012-07-10 14:02:58

标签: sql-server tsql sql-server-2008-r2

我们的首席数据库程序员本周休假,我被困住了。

我有一个包含以下子查询的视图:

select cast(cast(getdate() + i as date) as datetime) DATEVALUE 
from NumbersTable(1,100,1)

我不知道这是做什么的,当我尝试在Squirrel中运行时,我得到:

Error: Procedure or function NumbersTable has too many arguments specified.
SQLState:  37000
ErrorCode: 8144

以下是为NumbersTable创建的函数:

    CREATE FUNCTION NumbersTable (
  @fromNumber int,
  @toNumber int,
  @byStep int
) RETURNS TABLE
RETURN (

WITH CTE_NumbersTable AS (
  SELECT @fromNumber AS i
  UNION ALL
  SELECT i + @byStep
  FROM CTE_NumbersTable
  WHERE
  (i + @byStep) <= @toNumber
)
SELECT * 
FROM CTE_NumbersTable
)
;

CREATE FUNCTION NumbersTable (
  @fromNumber int,
  @toNumber int
) RETURNS TABLE
RETURN (
WITH T_0_THRU_15 AS (
SELECT 0 j UNION ALL
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6 UNION ALL
SELECT 7 UNION ALL
SELECT 8 UNION ALL
SELECT 9 UNION ALL
SELECT 10 UNION ALL
SELECT 11 UNION ALL
SELECT 12 UNION ALL
SELECT 13 UNION ALL
SELECT 14 UNION ALL
SELECT 15 
)
SELECT T1.j + (T2.j*16) + (T3.j*256) + @fromNumber i
FROM   T_0_THRU_15 T1, T_0_THRU_15 T2, T_0_THRU_15 T3
WHERE T1.j + (T2.j*16) + (T3.j*256) + @fromNumber <= @toNumber
)
;

我正在针对Microsoft SQL Server 2008 R2运行此操作。奇怪的是,我相信我之前已经对这个数据库运行了这个代码并且它有效,我根本不知道现在要做什么。

4 个答案:

答案 0 :(得分:1)

检查NumbersTable函数或存储过程的代码。这将显示它将接受多少参数。

错误告诉您传入了太多参数。

from NumbersTable(1,100,1) 

根据NumbersTable的代码,您将调整参数。

答案 1 :(得分:1)

NumbersTable可能是table valued function

试试这个:

select cast(cast(getdate() + i as date) as datetime) DATEVALUE  
from dbo.NumbersTable(1,100,1) 

这可能意味着“以1为增量将值从1返回到100”。

SQL Fiddle Example

答案 2 :(得分:0)

  

以下是NumbersTable的函数create s

SQL Server不允许函数重载;您列出的CREATE FUNCTION中只有一个将是相关数据库中的实际定义。从错误消息判断,我会说你试图使用的代码是期望三参数的,但实际上你所在的数据库有双参数版本。

经验教训是,当您的首席数据库程序员休假时,不要进行重大升级......

答案 3 :(得分:0)

如果您想要的是返回接下来的100天,为什么不创建一个这样做的功能呢?这将占用任何日期,任何天数(最多约7000),并返回日期列表:

CREATE FUNCTION dbo.GenerateDaySequence
(
  @StartDate DATE,
  @NumDays   INT
)
RETURNS TABLE
AS
  RETURN 
  (
    SELECT TOP (@NumDays) 
      d = DATEADD(DAY,  
        ROW_NUMBER() OVER (ORDER BY s1.[object_id])-1, 
      @StartDate)
    FROM sys.all_columns AS s1
  );
GO

样本用法:

SELECT d FROM dbo.GenerateDaySequence(GETDATE(), 100);

结果:

d 
----------
2012-07-10
2012-07-11
...
2012-10-16
2012-10-17