自定义存储过程udfWeek无法返回星期几结果的技术咨询
问题分析与解决方案
嘿,我一眼就瞅出你代码里的几个小问题啦,这就是为啥执行后没返回结果的原因:
核心问题点
- 你混淆了**存储过程(Procedure)和用户定义函数(UDF)**的用法:你用
alter procedure定义的是存储过程,但却用调用函数的方式select dbo.udfWeek(...)来执行,这根本不匹配。 - 存储过程里的
print语句只会在SQL Server的消息窗口输出内容,不会作为查询结果集返回,所以你在结果标签页看不到东西。
修正方案:改成标量值函数
如果想要实现可以用select调用并返回结果的功能,咱们应该定义成标量值用户定义函数,代码如下:
方案1:返回星期对应的数字
-- 创建(或修改)标量函数,返回星期数字(注意:数字对应的星期几取决于你的服务器语言设置) CREATE OR ALTER FUNCTION udfWeek(@days datetime) RETURNS int AS BEGIN RETURN DATEPART(weekday, @days) END GO -- 调用函数,此时会正常返回结果集 SELECT dbo.udfWeek('2011-11-11') AS 星期数字
方案2:返回具体的星期名称
如果想要直接返回“星期一”“星期五”这类名称,可以用DATENAME代替DATEPART:
CREATE OR ALTER FUNCTION udfWeek(@days datetime) RETURNS nvarchar(20) AS BEGIN RETURN DATENAME(weekday, @days) END GO -- 调用示例 SELECT dbo.udfWeek('2011-11-11') AS 星期名称
补充:如果坚持用存储过程
要是你就想用存储过程实现,那得用正确的调用方式,并且可以通过输出参数或者结果集返回内容:
ALTER PROCEDURE procWeek(@days datetime) AS BEGIN -- 直接返回结果集,而不是用print SELECT DATEPART(weekday, @days) AS 星期数字 END GO -- 调用存储过程的正确方式 EXEC dbo.procWeek '2011-11-11'
内容的提问来源于stack exchange,提问作者Escaper
相关产品推荐
相关产品推荐

