2013-03-10 48 views
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 

我已經創建了此函數,它需要三個參數。我有幾個有關執行此功能的問題。SQL Server函數錯誤 - 從字符串轉換日期和/或時間時轉換失敗

轉換失敗時從字符串轉換日期和/或時間

這是我收到的錯誤,當我嘗試以下方式

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

執行這種功能,它即使我通過2012-03-10而不是getdate()

I也想學習如何以列表的形式傳遞參數。作爲參數之一是以列表的形式。讓我知道你是否想要更多關於該功能的信息。

這是其在上述寫入的功能中使用的功能:

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

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

END 
GO 
+0

'23:59:59' 這個不能轉換到'DATETIME'。也正確的標籤。 – 2013-03-10 19:52:01

+0

更正的標籤。將看看你的解釋。謝謝 – user2087822 2013-03-10 20:00:15

+0

'PL/SQL'沒有'DATEADD'功能。我假設你使用'SQL Server'。 – 2013-03-10 20:04:06

回答

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 
+0

謝謝這工作。我在表格定義和我的選擇查詢中犯了一個錯誤。 – user2087822 2013-03-12 16:40:25

0

的問題不是在[dbo].[fn_InventoryPositionSet]它是在[dbo].[COBTimestamp]

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

DATEADD (Transact-SQL)

+0

您不需要評論任何行,您必須將正確的參數傳遞給'DATEADD'函數。 – 2013-03-10 20:14:52

+0

SQL Server中''23:59:59''位[沒有問題](http://sqlfiddle.com/#!3/d41d8/10699)。 – 2013-03-10 23:05:48

相關問題