2
CREATE FUNCTION [dbo].[fn_InventoryPositionSet]
(
    @PointInTime DATETIME,
    @EOD BIT,
    @AccountList Varchar(max)
)
RETURNS @OffersTable TABLE
(
    Account            VARCHAR(10),
    PositionId         VARCHAR(150),
    VersionDate        DATETIME,
    ProductType        VARCHAR(50),
    XRef               VARCHAR(50),
    XRefType           VARCHAR(20),
    Desk               VARCHAR(50)

)
AS
BEGIN
    IF @EOD = 1 
        SET @PointInTime = dbo.COBTimestamp(@PointInTime)

    IF @AccountList is not NULL     
                INSERT INTO @OffersTable
                SELECT      
                    P.Account,
                    P.UniquePositionId AS [PositionId],
                    P.Desk,
                    P.VersionEffective AS [VersionDate],
                    P.ProductType,
                    P.XRef,
                    P.XRefType
                FROM MarkingInventory AS P WITH(nolock)
                LEFT JOIN 
                    Spirit.dbo.GetTableOfInputs(@AccountList) A 
                    ON 
                        ( 
                            (P.Account = A.Input)
                            AND 
                            @AccountList IS NOT NULL 
                        )
                WHERE 
                    @PointInTime >= P.VersionEffective AND @PointInTime < P.VersionExpiration and P.Account = A.Input
    ELSE
        INSERT INTO @OffersTable
                SELECT      
                    P.Account,
                    P.UniquePositionId AS [PositionId],
                    P.Desk,
                    P.VersionEffective AS [VersionDate],
                    P.ProductType,
                    P.XRef,
                    P.XRefType
                FROM MarkingInventory AS P WITH(nolock)
                WHERE 
                    @PointInTime >= P.VersionEffective AND @PointInTime < P.VersionExpiration 

RETURN
END

3つのパラメーターを受け取るこの関数を作成しました。この関数の実行に関していくつか質問があります。

文字列から日付や時刻を変換するときに変換に失敗しました

これは、この関数を次のように実行しようとしたときに受け取るエラーです。

select * from [dbo].[fn_InventoryPositionSet] (GETDATE(), 1, null)

2012-03-10代わりに合格しても失敗するgetdate()

また、リスト形式でパラメーターを渡す方法についても学びたいと思います。パラメータの1つがリストの形式であるため。関数についてさらに情報が必要な場合はお知らせください。

これは、上記の関数で使用される関数です。

CREATE FUNCTION [dbo].[COBTimestamp]
(
    @COBDate DATETIME
)
RETURNS DATETIME
AS
BEGIN

    RETURN DATEADD(day, DATEDIFF(day, 0, @COBDate), '23:59:59')             

END
GO
4

2 に答える 2

0

そこにない問題[dbo].[fn_InventoryPositionSet]はにあり[dbo].[COBTimestamp]ます。

RETURN DATEADD(day, DATEDIFF(day, 0, @COBDate), '23:59:59')
                                                    ^__________ Must be converted to `DATETIME`

DATEADD(Transact-SQL)

于 2013-03-10T19:55:34.987 に答える
0

テーブルの定義を見てください。

1. Account            VARCHAR(10),
2. PositionId         VARCHAR(150),
*** 3. VersionDate        DATETIME, ***
4. ProductType        VARCHAR(50),
5. XRef               VARCHAR(50),
6. XRefType           VARCHAR(20),
7. Desk               VARCHAR(50)

そしてあなたのSELECT:

            SELECT      
                1. P.Account,
                2. P.UniquePositionId AS [PositionId],
                *** 3. P.Desk, ***
                4. P.VersionEffective AS [VersionDate],
                5. P.ProductType,
                6. P.XRef,
                7. P.XRefType
于 2013-03-12T14:34:22.010 に答える