-1

我们的首席数据库程序员这周外出度假,我被困住了。

我有一个正在创建的视图,其中包括以下子查询:

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

4 回答 4

1

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

该错误告诉您您传递的参数太多。

from NumbersTable(1,100,1) 

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

于 2012-07-10T14:07:10.920 回答
1

NumbersTable 可能是一个表值函数

尝试这个:

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

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

SQL 小提琴示例

于 2012-07-10T14:07:13.950 回答
0

下面是NumbersTable的create 函数:

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

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

于 2012-07-10T14:25:05.837 回答
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
于 2012-07-10T14:54:26.260 回答