我创建了一个函数,在其中放置了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时,转换失败。
如何在函数内部输入该值。
答案 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)