Sql server 使用case语句创建用户定义函数

Sql server 使用case语句创建用户定义函数,sql-server,tsql,Sql Server,Tsql,我正在尝试创建一个UDF来将字符串从列转换为日期。我有一列last_time_received_services,其中周期被称为字符串。我可以用下面的case语句成功地将其转换为日期。如何将此case语句写入函数中,以便将此函数应用于整个列 case when last_time_received_services like 'Jan-%' then cast(('20' + (right(last_time_received_services,2))) + '-' +'01

我正在尝试创建一个UDF来将字符串从列转换为日期。我有一列last_time_received_services,其中周期被称为字符串。我可以用下面的case语句成功地将其转换为日期。如何将此case语句写入函数中,以便将此函数应用于整个列

case 
        when last_time_received_services like 'Jan-%' then  cast(('20' + (right(last_time_received_services,2))) + '-' +'01'+ '-' +'01' as date) --1
        when last_time_received_services like 'Feb-%' then  cast(('20' + (right(last_time_received_services,2))) + '-' +'02'+ '-' +'01' as date)--2
        when last_time_received_services like 'Mar-%' then  cast(('20' + (right(last_time_received_services,2))) + '-' +'03'+ '-' +'01'as date) --3
        when last_time_received_services like 'Apr-%' then  cast(('20' + (right(last_time_received_services,2))) + '-' +'04'+ '-' +'01' as date)--4
        when last_time_received_services like 'May-%' then  cast(('20' + (right(last_time_received_services,2))) + '-' +'05'+ '-' +'01' as date)--5
        when last_time_received_services like 'Jun-%' then  cast(('20' + (right(last_time_received_services,2))) + '-' +'06'+ '-' +'01' as date)--6
        when last_time_received_services like 'Jul-%' then  cast(('20' + (right(last_time_received_services,2))) + '-' +'07'+ '-' +'01' as date)--7
        when last_time_received_services like 'Aug-%' then  cast(('20' + (right(last_time_received_services,2))) + '-' +'08'+ '-' +'01' as date)--8
        when last_time_received_services like 'Sep-%' then  cast(('20' + (right(last_time_received_services,2))) + '-' +'09'+ '-' +'01' as date)--9
        when last_time_received_services like 'Oct-%' then  cast(('20' + (right(last_time_received_services,2))) + '-' +'10'+ '-' +'01' as date)--10
        when last_time_received_services like 'Nov-%' then  cast(('20' + (right(last_time_received_services,2))) + '-' +'11'+ '-' +'01' as date)--11
        when last_time_received_services like 'Dec-%' then  cast(('20' + (right(last_time_received_services,2))) + '-' +'12'+ '-' +'01' as date)--12
        --Quarterly Payments
        when last_time_received_services like '%- March%' then  cast(('20' + (right(last_time_received_services,2))) + '-' +'03'+ '-' +'01'as date) --3
        when last_time_received_services like '%- June%' then  cast(('20' + (right(last_time_received_services,2))) + '-' +'06'+ '-' +'01' as date)--6
        when last_time_received_services like '%- September%' then  cast(('20' + (right(last_time_received_services,2))) + '-' +'09'+ '-' +'01'as date) --9
        when last_time_received_services like '%- December%' then  cast(('20' + (right(last_time_received_services,2))) + '-' +'12'+ '-' +'01' as date)--12
        else ''
    end  as converted_last_service_date

理想情况下,您希望使其成为内联表值函数,而不是标量函数。将其转换为函数非常简单。您需要的不是列,而是参数

create function ConvertMyDate
(
    @last_time_received_services varchar(100) --or whatever is appropriate
) returns table as return

    select 
        case 
            when @last_time_received_services like 'Jan-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'01'+ '-' +'01' as date) --1
            when @last_time_received_services like 'Feb-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'02'+ '-' +'01' as date)--2
            when @last_time_received_services like 'Mar-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'03'+ '-' +'01'as date) --3
            when @last_time_received_services like 'Apr-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'04'+ '-' +'01' as date)--4
            when @last_time_received_services like 'May-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'05'+ '-' +'01' as date)--5
            when @last_time_received_services like 'Jun-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'06'+ '-' +'01' as date)--6
            when @last_time_received_services like 'Jul-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'07'+ '-' +'01' as date)--7
            when @last_time_received_services like 'Aug-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'08'+ '-' +'01' as date)--8
            when @last_time_received_services like 'Sep-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'09'+ '-' +'01' as date)--9
            when @last_time_received_services like 'Oct-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'10'+ '-' +'01' as date)--10
            when @last_time_received_services like 'Nov-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'11'+ '-' +'01' as date)--11
            when @last_time_received_services like 'Dec-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'12'+ '-' +'01' as date)--12
            --Quarterly Payments
            when @last_time_received_services like '%- March%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'03'+ '-' +'01'as date) --3
            when @last_time_received_services like '%- June%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'06'+ '-' +'01' as date)--6
            when @last_time_received_services like '%- September%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'09'+ '-' +'01'as date) --9
            when @last_time_received_services like '%- December%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'12'+ '-' +'01' as date)--12
            else ''
        end  as converted_last_service_date
GO
要演示如何使用内联表值函数,需要执行以下操作。内联表值函数的性能增益是惊人的

select t,*
    , f.converted_last_service_date
from table1 as t
cross apply [dbo].[ConvertMyDate](t.last_time_received_services) as f

我认为使用可以创建标量值函数

CREATE FUNCTION ConvertStringToDate
(   
    @last_time_received_services NVARCHAR(150)
)
RETURNS DATE
AS
BEGIN
    DECLARE @dateResult DATE
    select @dateResult =
    case 
        when @last_time_received_services like 'Jan-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'01'+ '-' +'01' as date) --1
        when @last_time_received_services like 'Feb-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'02'+ '-' +'01' as date)--2
        when @last_time_received_services like 'Mar-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'03'+ '-' +'01'as date) --3
        when @last_time_received_services like 'Apr-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'04'+ '-' +'01' as date)--4
        when @last_time_received_services like 'May-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'05'+ '-' +'01' as date)--5
        when @last_time_received_services like 'Jun-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'06'+ '-' +'01' as date)--6
        when @last_time_received_services like 'Jul-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'07'+ '-' +'01' as date)--7
        when @last_time_received_services like 'Aug-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'08'+ '-' +'01' as date)--8
        when @last_time_received_services like 'Sep-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'09'+ '-' +'01' as date)--9
        when @last_time_received_services like 'Oct-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'10'+ '-' +'01' as date)--10
        when @last_time_received_services like 'Nov-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'11'+ '-' +'01' as date)--11
        when @last_time_received_services like 'Dec-%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'12'+ '-' +'01' as date)--12
        --Quarterly Payments
        when @last_time_received_services like '%- March%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'03'+ '-' +'01'as date) --3
        when @last_time_received_services like '%- June%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'06'+ '-' +'01' as date)--6
        when @last_time_received_services like '%- September%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'09'+ '-' +'01'as date) --9
        when @last_time_received_services like '%- December%' then  cast(('20' + (right(@last_time_received_services,2))) + '-' +'12'+ '-' +'01' as date)--12
        else ''
    end 

    RETURN @dateResult

END
GO
在查询中使用它,就像

SELECT dbo.ConvertStringToDate(last_time_received_services)
FROM your_table

谢谢你的回答。该函数已成功创建,但如果我上次在这一列上运行它,我会收到以下错误消息:找不到列dbo或用户定义函数或聚合dbo.ConvertMyDate,或者名称不明确。在一列上运行它是什么意思?你能分享你试过的代码吗?Edward的代码解决了这个问题,因为我想我想把它用作标量函数。这就是我运行的:select*,[dbo].[ConvertMyDate]上次\u从Table1接收\u服务您不需要标量函数。我如何使其作为内联表值函数工作标量函数对性能非常不利。至少在他们最终整理出内联函数逻辑之前。不过,这要等到下一个版本才能实现就这样!谢谢你的回答!!你能解释一下为什么标量函数比内联表值函数更好吗?这可能要归结到你如何使用它。我想他只是想用SELECT转换数据,所以将使用标量函数。看看他的例子,标量不是他们想要的。