-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
)
;

これをMicrosoftSQLServer2008R2に対して実行しています。奇妙なことに、私は以前にこのデータベースに対してこのコードを実行したことがあり、それが機能し、今何をすべきかわからないと信じています。

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から100までの値を1刻みで返す」という意味です。

SQLフィドルの例

于 2012-07-10T14:07:13.950 に答える
0

NumbersTableの関数createは次のとおりです。

SQL Serverでは、関数のオーバーロードは許可されていません。リストしたの1つだけがCREATE FUNCTION、問題のデータベースの実際の定義になります。エラーメッセージから判断すると、使用しようとしているコードは3パラメーターバージョンを想定していると思いますが、実際には、使用しているデータベースには2パラメーターバージョンがあります。

教訓は、チーフデータベースプログラマーが休暇中にメジャーアップグレードを行わないことです...

于 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 に答える