![](/img/trans.png)
[英]How to refresh the definition of a T-SQL user-defined function after a dependent object is redefined?
[英]How to convert a CASE Statement into a User-defined Function in T-SQL
我正在使用SQL Server 2014,并且在T-SQL查询中具有以下CASE语句。
(CASE
WHEN c.[Market FINAL] = 'Overbooking' AND c.[Booking type] = 'GRP' THEN 'Overbooking'
WHEN c.[TaProfileID] = 853 THEN 'Poland (TUI only)'
WHEN c.[Source of Business] = 'TO' AND c.[CountryName] = 'Netherlands' THEN 'Netherlands'
WHEN c.[Source of Business] = 'DMC' AND c.[Booking Origin (1)] = 'Netherlands' THEN 'Netherlands'
WHEN c.[Booking type] = 'GRP' THEN 'G&I'
ELSE c.[Market FINAL]
END) AS 'Market',
我想从此查询中将其删除,并将其作为用户定义的函数运行,但是我很难创建该函数。 另外,一旦查询作为函数运行,我将如何在查询中使用它?
CREATE FUNCTION [dbo].[_fnMyCase] ( @Filter1 AS VARCHAR(20) , @Filter2 AS VARCHAR(20)) RETURNS VARCHAR(20) AS BEGIN DECLARE @MyReturn AS VARCHAR(20) = '' SELECT @MyReturn = (CASE WHEN c.[Market FINAL] = 'Overbooking' AND c.[Booking type] = 'GRP' THEN 'Overbooking' WHEN c.[TaProfileID] = 853 THEN 'Poland (TUI only)' WHEN c.[Source of Business] = 'TO' AND c.[CountryName] = 'Netherlands' THEN 'Netherlands' WHEN c.[Source of Business] = 'DMC' AND c.[Booking Origin (1)] = 'Netherlands' THEN 'Netherlands' WHEN c.[Booking type] = 'GRP' THEN 'G&I' ELSE c.[Market FINAL] END) FROM c WHERE Filter1 = @Filter1 AND Filter2 = @Filter2 RETURN @MyReturn END
这种逻辑看起来像设计缺陷。 但是,由于所有列都在同一个表中,因此建议使用计算列:
CREATE TABLE SomeTable
(
[Market Final] varchar(20),
[Booking type] varchar(10),
TaProfileId int,
[Source of Business] varchar(10),
[CountryName] varchar(20),
[Booking Origin (1)] varchar(10),
--Other fields
Market AS
CASE
WHEN [Market FINAL] = 'Overbooking' AND [Booking type] = 'GRP' THEN 'Overbooking'
WHEN [TaProfileID] = 853 THEN 'Poland (TUI only)'
WHEN [Source of Business] = 'TO' AND [CountryName] = 'Netherlands' THEN 'Netherlands'
WHEN [Source of Business] = 'DMC' AND [Booking Origin (1)] = 'Netherlands' THEN 'Netherlands'
WHEN [Booking type] = 'GRP' THEN 'G&I'
ELSE [Market FINAL]
END
)
然后,您可以使用:
SELECT c.Market, ...
FROM SomeTable c
您应该创建类似以下的函数。
CREATE FUNCTION [dbo].[fnMyCase] (
@MarketFINAL VARCHAR(50)
,@Bookingtype VARCHAR(50)
,@TaProfileID INT
,@SourceofBusiness VARCHAR(50)
,@CountryName VARCHAR(50)
,@BookingOrigin VARCHAR(50)
)
RETURNS VARCHAR(20)
AS
BEGIN
DECLARE @MyReturn AS VARCHAR(50) = ''
SELECT @MyReturn = (
CASE
WHEN @MarketFINAL = 'Overbooking'
AND @Bookingtype = 'GRP'
THEN 'Overbooking'
WHEN @TaProfileID = 853
THEN 'Poland (TUI only)'
WHEN @SourceofBusiness = 'TO'
AND @CountryName = 'Netherlands'
THEN 'Netherlands'
WHEN @SourceofBusiness = 'DMC'
AND @BookingOrigin = 'Netherlands'
THEN 'Netherlands'
WHEN @Bookingtype = 'GRP'
THEN 'G&I'
ELSE @MarketFINAL
END
)
RETURN @MyReturn
END
像这样调用函数
SELECT *
,[dbo].[fnMyCase](c.[Market FINAL], c.[Booking type], c.[TaProfileID], c.[Source of Business], c.[CountryName], c.[Booking Origin (1)]) AS Market
FROM c
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.