SQL函数:将变量从varchar转换为tinyint

时间:2018-12-05 13:01:06

标签: sql sql-server tsql stored-functions

我创建了一个函数,在其中放置了3个变量:

@yy int,@ kW int,@ Wert varchar(50)

在此函数内,我将值插入@return_variable。

@Wert的问题如下:'14,15,1,2,4,5,6,7,27'

create FUNCTION [dbo].[F_Work](@yy int, @kW int, @Wert varchar(50) )
RETURNS 
 @return_variable TABLE
(   Stunden int,
    kW int,
    Wert varchar(50)

)
AS
    BEGIN
        declare @Tag date;
        declare @wk int ;

            BEGIN

                 set @TAg = (select top 1 StartTime from [dbo].[Work]           
                 where  DATEPART(ISO_WEEK, StartTime) = @kW and DATEPART( YY, StartTime) = @yy order by Starttime desc)

                Insert into @return_variable (Stunden, kW, Wert  ) 
                 select SUM(ROUND(CAST(DATEDIFF(minute, A.StartTime, A.EndTime) AS float) / 60, - 0)) , DATEPART( ISO_WEEK, A.StartTime ) as KW, B.Wert     
                            FROM 
                            [dbo].[Work] A join 
                            [dbo].[Workload] B on A.TS_ID = B.TS_ID 
                            where 
                            A.TS_ID in (@Wert )

                            group by DATEPART( ISO_WEEK, A.StartTime ), B.Wert
                            order by 3,2

            END
    return
    END


--  select Stunden  from [dbo].[F_Work](2018,40,'14,15,1,2,4,5,6,7,27') 

我得到一个错误: 将varchar值'14,15,1,2,4,5,6,7,27'转换为数据类型tinyint时,转换失败。

如何在函数内部输入该值。

1 个答案:

答案 0 :(得分:0)

在类似where A.TS_ID in (@Wert)的表达式中,该参数不是用字符串表示形式“替换”并执行结果。您可以使用动态SQL进行此操作-将查询构造为字符串,然后使用sp_executesql执行。

如果您使用的是SQL Server 2016或更高版本,则可以利用STRING_SPLIT函数的优势并将查询更改为类似的内容:

where A.TS_ID in (select try_cast(value as int) from STRING_SPLIT(@Wert, ','))

但是最好的解决方案是,如果值是真实列表而不是用逗号分隔的值的字符串,则只将列表传递。您可以通过用一列定义用户定义的表类型并将@Wert参数设置为table-valued parameter来实现此目的:

CREATE TYPE dbo.ListOfInts AS TABLE (IntValue INT);  
GO  

然后将函数的定义更改为:

create FUNCTION [dbo].[F_Work](@yy int, @kW int, @Wert dbo.ListOfInts READONLY)

然后您可以像这样在查询中使用它:

where A.TS_ID in (select IntValue from @Wert)