用东西 sql 修剪标量 UDF

Posted

技术标签:

【中文标题】用东西 sql 修剪标量 UDF【英文标题】:Trim inside the Scalar UDF with stuff sql 【发布时间】:2017-05-10 10:00:05 【问题描述】:

我有一个表值函数

ALTER FUNCTION [dbo].[GetFareBasisDetails](@BookingID INT)
RETURNS TABLE
AS
RETURN
SELECT STUFF(
(
    SELECT ','+REPLACE(PriceDetails.query(N'data(/FareInfo/Price/AB/PQ)').value(N'.',N'nvarchar(max)'),' ',',')
    FROM [Traveler] [T]
    WHERE [T].BookingID=@BookingID
    FOR XML PATH('')
),1,1,'') AS FarePriceBasis;

为了获取 FarePriceBasis 的值,我在一个存储过程中使用了这个函数,该函数通过 GetFareBasisDetails 应用连接。 sp里面的代码块是

由于我的结果中有多余的逗号,所以我在 sp 中对其进行了修剪。

CASE 
            WHEN RIGHT(RTRIM(REPLACE([FB].FarePriceBasis,',,',',')),1) = ',' THEN 
                LEFT(REPLACE([FB].FarePriceBasis,',,',','), LEN(REPLACE([FB].FarePriceBasis,',,',',')) - 1)
            ELSE REPLACE([FB].FarePriceBasis,',,',',') END [FarePriceBasis]

我想在函数内移动修剪逻辑。 即在 sp 内,我只能使用 [FB].FarePriceBasis。 所有的修剪逻辑都应该移到函数 GetFareBasisDetails 中。

提前致谢。

【问题讨论】:

你使用的是哪个版本的sql server? @KannanKandasamy:使用 SQL Server 2008 您是否有任何示例数据和架构来突出问题? @Steve :我只需要优化它,将修剪逻辑移动到 UDF 中。所以在 SP 里面我只能做 [FB].FarePriceBasis 【参考方案1】:

我想我一定遗漏了一些东西,因为你可以将你的 case 语句移到函数中。它不漂亮,无疑有更好的解决方案,但你可以这样做。

ALTER FUNCTION [dbo].[GetFareBasisDetails](@BookingID INT)
RETURNS TABLE
AS
RETURN
SELECT CASE WHEN RIGHT(RTRIM(REPLACE([FB].FarePriceBasis,',,',',')),1) = ',' 
              THEN LEFT(REPLACE([FB].FarePriceBasis,',,',','), LEN(REPLACE([FB].FarePriceBasis,',,',',')) - 1)
              ELSE REPLACE([FB].FarePriceBasis,',,',',') END [FarePriceBasis]
FROM  ( SELECT STUFF(
              (
                  SELECT  ','+REPLACE(PriceDetail,' ',',')
                  FROM    [Traveler] [T]
                  WHERE   [T].BookingID=@BookingID
                  FOR XML PATH('')
              ), 1, 1, '') AS FarePriceBasis
      ) FB
GO

【讨论】:

以上是关于用东西 sql 修剪标量 UDF的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2008 R2 - 标量 UDF 导致无限循环

SQL Server 2005 标量 UDF 性能

MS SQL Server 中的标量 UDF 在查询中仅返回一个值

SQL CLR标量UDF中的DES解密不起作用

为啥我不能绘制不是标量、一维或 (2, n) 数组的东西?

MSSQL 上标量 UDF 中的 NULL 参数