我们的首席数据库程序员本周休假,我被困住了。
我有一个包含以下子查询的视图:
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运行此操作。奇怪的是,我相信我之前已经对这个数据库运行了这个代码并且它有效,我根本不知道现在要做什么。
答案 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”。
答案 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