Trim 在标量 UDF 中包含 sql
Trim inside the Scalar UDF with stuff sql
我有一个表值函数
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 中的代码块是
因为我在结果中得到了额外的逗号,所以我trim将它放在 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]
我想将 trim 逻辑移动到函数内部。
即在 sp 内,我只能使用 [FB].FarePriceBasis。
所有 trimming 逻辑都应该移到函数 GetFareBasisDetails 中。
提前致谢。
我想我一定遗漏了一些东西,因为您可以将 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
我有一个表值函数
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 中的代码块是
因为我在结果中得到了额外的逗号,所以我trim将它放在 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]
我想将 trim 逻辑移动到函数内部。 即在 sp 内,我只能使用 [FB].FarePriceBasis。 所有 trimming 逻辑都应该移到函数 GetFareBasisDetails 中。
提前致谢。
我想我一定遗漏了一些东西,因为您可以将 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