2016-08-18 151 views
1

我有一個與這些列上創建一個表名爲TaxLots:SQL Server 2012中內嵌表值函數返回空行

CREATE TABLE Portfolio.TaxLots 
(
Ticker varchar(22) NOT NULL, 
SecurityDescription varchar(50) NOT NULL, 
Class varchar(15) NULL, 
Ccy varchar(5) NULL, 
LSPosition char(3) NULL, 
Date date NULL, 
Quantity int NULL, 
LocAvgCost decimal(8,3) NULL, 
LocTaxCostBasis int NULL, 
LocMktVal int NULL, 
BaseAvgCost decimal(8,3) NULL, 
BaseTaxCostBasis int NULL, 
BaseMktVal int NULL, 
BaseUNRL int NULL, 
DateCreated DATE NOT NULL DEFAULT Cast(GetDate() as Date) 
) 
GO 

我希望創建一個將拉動一些列的功能特定的Ticker(這將是我的參數)的最後DateCreated。我創建了以下功能:

USE FundDB 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE FUNCTION dbo.GetTaxLots 
( 
@Ticker varchar 
) 
RETURNS TABLE 
AS 
RETURN 
(
SELECT 
    TL.Ticker, 
    TL.SecurityDescription, 
    TL.LSPosition, 
    TL.Date, 
    TL.Quantity, 
    TL.LocAvgCost, 
    TL.LocTaxCostBasis, 
    TL.BaseAvgCost, 
    TL.BaseTaxCostBasis, 
    TL.DateCreated, 
    (SELECT SUM(Quantity) 
    FROM 
    Portfolio.TaxLots) AS TotalQuantity 
FROM 
    Portfolio.TaxLots TL 
WHERE 
    TL.DateCreated= (SELECT Max(TL.DateCreated) FROM Portfolio.TaxLots TL) 
    AND TL.Ticker = @Ticker 
) 

我用新浪體育訊北京時間硬編碼測試的SELECT語句本身,它給我想要的結果,但是當我嘗試使用SELECT語句像這樣使用的功能:

USE FundDB 
SELECT * 
FROM dbo.GetTaxLots('MSFT') 
GO 

我得到空行。很困惑。我很新,所以我覺得我錯過了一些明顯的東西。

回答

3

你需要設置你的@Ticker變量

CREATE FUNCTION dbo.GetTaxLots 
( 
    @Ticker varchar(22) 
) 

如果你只是使用@Ticker varchar變量只能1個字符長的正確尺寸,所以當你調用SELECT * FROM dbo.GetTaxLots('MSFT')@Ticker在你的函數值將是隻是M

作爲一個側面說明..它可能有助於性能將您的2個子查詢組合成一個派生表。

SELECT TL.Ticker, 
     TL.SecurityDescription, 
     TL.LSPosition, 
     TL.Date, 
     TL.Quantity, 
     TL.LocAvgCost, 
     TL.LocTaxCostBasis, 
     TL.BaseAvgCost, 
     TL.BaseTaxCostBasis, 
     TL.DateCreated, 
     IJ.TotalQuantity 
FROM Portfolio.TaxLots TL 
     INNER JOIN (SELECT SUM(Quantity) TotalQuantity, 
          MAX(DateCreated) MaxCreateDate 
        FROM Portfolio.TaxLots) IJ ON TL.DateCreated = IJ.MaxCreateDate 
WHERE TL.Ticker = @Ticker 
+0

OMG ...太簡單了。謝謝! – MilesToGoBeforeISleep

+0

再次感謝Jamie的旁註。您能否告訴我一個派生表如何提高子查詢的性能? – MilesToGoBeforeISleep

+1

,因爲您不過濾子查詢,它們很可能會很快並且從每行的緩存中拉出來,因此性能可能不會顯着提高,但最好避免在您的選擇或其中可能的位置進行子查詢 – JamieD77

相關問題