sql-server - SQL Server 2012 内联表值函数返回空行

标签 sql-server t-sql inline-table-function

我有一个名为 TaxLots 的表,它是使用以下列创建的:

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

我想创建一个函数,为最后一个 DateCreated 的特定 Ticker(这将是我的参数)提取其中一些列。我创建了以下函数:

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
)

我使用 Ticker 硬编码测试了 SELECT 语句本身,它给出了我想要的结果,但是当我尝试使用如下所示的 SELECT 语句来使用该函数时:

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

我得到空行。很困惑。我对此很陌生,所以我觉得我错过了一些明显的东西。

最佳答案

您需要设置 @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

关于sql-server - SQL Server 2012 内联表值函数返回空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39022873/

相关文章:

sql-server - T-SQL 计算时间窗口内的事件数

mysql - 按月和年创建sql表

sql - 如何在没有破折号和冒号的情况下将 DateTime 转换为 VARCHAR()

.net - SQL Server 和 TransactionScope(带 MSDTC): Sporadically can't get connection

sql - 为什么在 SQL Server 2008 R2 中设置当前标识值对我不起作用?

sql - 从 case 表达式中排除

sql - OR 和索引创建