【发布时间】:2018-12-05 13:01:06
【问题描述】:
我创建了一个函数,我在其中放入了 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 时转换失败。
如何在函数内部输入这个值。
【问题讨论】:
-
你不明白错误的哪一部分?您不应该将数字列表作为字符串传递。研究定义表类型以将列表传递给存储函数。
-
IN不能那样工作。有alternate approaches。 -
问题是,我不能在函数内部进行 CAST。
-
如果您包含重现该案例所需的完整 SQL,包括创建表,将很容易得到答案。但是 in 需要一个整数序列,并且您不能将字符串与序列本身一起传递,除非您将 sql 命令组合为要使用带有 OUTPUT 的 sp_executesql 命令执行的字符串
-
如果您将其设为内联表值函数,您将获得一些明确的性能优势。你这里有多个语句,它们的性能通常比标量函数还要差。
标签: sql sql-server tsql stored-functions