2013-03-10 2 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) 

다음의이 기능을 실행하려고 할 때 문자열에서 날짜 및/또는 시간을 변환하는

이 내가받을 오류 때 실패 그것은 패스 할 때조차도 실패 함 getdate() 대신

또한 목록 형식으로 매개 변수를 전달하는 방법을 배우고 싶습니다. 매개 변수 중 하나가 목록 형식이므로 기능에 대한 추가 정보가 필요한 경우 알려 주시기 바랍니다. 이 [dbo].[COBTimestamp]

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'으로 변경하십시오. 또한 올바른 태그. –

+0

수정 된 태그. 당신의 설명을 들여다 볼 것입니다. 감사합니다. – user2087822

+0

'PL/SQL'에는'DATEADD' 함수가 없습니다. 난 당신이'SQL 서버'를 사용한다고 가정합니다. –

답변

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

감사합니다. 테이블 정의와 select 쿼리에서 실수를했습니다. – user2087822

0

문제되지 [dbo].[fn_InventoryPositionSet]에서 :

상기 기록 기능에 사용되는 함수이다.

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

DATEADD (Transact-SQL)

+0

줄을 주석 처리 할 필요가 없으며 올바른 인수를 DATEADD 함수에 전달해야합니다. –

+0

SQL Server에서''23 : 59 : 59'' 비트 [문제가 없습니다] (http://sqlfiddle.com/#!3/d41d8/10699). –

관련 문제