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

Posted

技术标签:

【中文标题】SQL Server 2012 内联表值函数返回空行【英文标题】:SQL Server 2012 Inline table-valued function returning empty rows 【发布时间】:2016-08-18 16:05:36 【问题描述】:

我有一个名为 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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

天啊...如此简单。谢谢! 再次感谢 Jamie 的旁注。你能告诉我派生表如何提高子查询的性能吗? 由于您没有过滤子查询,因此它们很可能会很快并从每一行的缓存中提取,因此性能可能不会显着提高,但最好在您的选择中或尽可能避免子查询

以上是关于SQL Server 2012 内联表值函数返回空行的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在此 SQL Server 内联表值函数上收到 11555 错误?

如何在 SQL Server 中将拆分函数转换为内联表值 udf?

SQL Server 自定义函数(Function)——参数默认值

SQL Server 自定义函数(Function)——参数默认值

SQL Server 自定义函数

SQL Server 自定义函数