惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
S
Securelist
博客园 - Franky
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
IT之家
IT之家
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
The Cloudflare Blog
云风的 BLOG
云风的 BLOG
N
News and Events Feed by Topic
AI
AI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Schneier on Security
Schneier on Security
Attack and Defense Labs
Attack and Defense Labs
Vercel News
Vercel News
腾讯CDC
Google DeepMind News
Google DeepMind News
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
M
MIT News - Artificial intelligence
WordPress大学
WordPress大学
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
N
Netflix TechBlog - Medium
量子位
S
Schneier on Security
Hacker News: Ask HN
Hacker News: Ask HN
Cyberwarzone
Cyberwarzone
S
Security Affairs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
N
News and Events Feed by Topic
T
Tenable Blog
PCI Perspectives
PCI Perspectives
MyScale Blog
MyScale Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cyber Attacks, Cyber Crime and Cyber Security
W
WeLiveSecurity
N
News | PayPal Newsroom
P
Proofpoint News Feed
O
OpenAI News
C
CERT Recently Published Vulnerability Notes
B
Blog
Cisco Talos Blog
Cisco Talos Blog
Microsoft Security Blog
Microsoft Security Blog
V
Visual Studio Blog
MongoDB | Blog
MongoDB | Blog
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
Y
Y Combinator Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Spread Privacy
Spread Privacy

博客园 - allanlau

冒个泡 五危 快被网站的回复搞崩溃了! 紧急求助啊:当前平台上不支持“ResourcePool”如何解决? 你能有效制怒吗? 上善若水,厚德载物 “ASP 0201 错误 无效的默认脚本语言”的解决办法 - allanlau IIS里不能正常显示asp页面 转变 含义 鹰的重生 有种感觉叫回忆 windows的140个技巧! 求助啊,打开资源管理器的快捷键没用了 又一年了 有感而发,10年后我会在做什么 干掉ctfmon.exe 怎样才能娶到比尔-盖茨的女儿 dudu,想把原来的随笔分类好像很麻烦啊
SQL Server 中奇怪的 Return
allanlau · 2006-07-21 · via 博客园 - allanlau

    今天帮同事查找一个函数中的bug。给我的源代码如下:

if exists (select * from dbo.sysobjects where id = object_id(N'[tb_Holiday]'and OBJECTPROPERTY(id, N'IsUserTable'= 1)
drop table [tb_Holiday]
GO
--定义节假日表
CREATE TABLE tb_Holiday(
HDate 
smalldatetime primary key clustered--节假日期
Name nvarchar(50not null)             --假日名称
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_WorkDay]'and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_WorkDay]
GO
--计算两个日期之间的工作天数
CREATE FUNCTION f_WorkDay(
@dt_begin datetime,  --计算的开始日期
@dt_end  datetime   --计算的结束日期
)RETURNS int
AS
BEGIN
 
IF @dt_begin>@dt_end
  
RETURN(DATEDIFF(Day,@dt_begin,@dt_end)
   
+1-(
    
SELECT COUNT(*FROM tb_Holiday
    
WHERE HDate BETWEEN @dt_begin AND @dt_end))
 
RETURN(-(DATEDIFF(Day,@dt_end,@dt_begin)
  
+1-(
   
SELECT COUNT(*FROM tb_Holiday
   
WHERE HDate BETWEEN @dt_end AND @dt_begin)))
END
GO

    执行如下查询:
    select dbo.f_workday('2006-01-01','2006-02-01')
    select dbo.f_workday('2006-02-01','2006-01-01')
    和理想结果相差悬殊啊。
    虽然上本身就有逻辑的错误,但主要的问题不在这里。当时就怀疑实际语句的执行情况是否正确,测试后发现一个奇怪的问题。就是不管在函数还是存储过程中,return 后面加上确切的数字和简单的算术计算都没问题,都可以使函数或存储过程立刻返回。但是返回值中如果包含查询语句,如:return (select count(*) from TableName),那么函数或存储过程将继续执行,如果后面没有另外的return,外面得到的返回值倒是还能记得之前那个返回值(就是return (select count(*) from TableName)这句的返回值)。百思不得其解,网上随便查了查,没找到原因。难道return 后面的表达式不能是一个子查询?看看有哪位高手知晓其根本原因。