【发布时间】:2017-12-14 01:18:16
【问题描述】:
我编写了一个存储过程,用于根据表列中的值计算年龄。
这就是那个存储过程:
WITH ages AS
(
SELECT
DATEDIFF(YEAR, CONVERT(datetime, pf.Value, 104), pf.CreatedOn) END as Age
FROM
Fields pf
WHERE
pf.Value IS NOT NULL
)
SELECT
(SELECT COUNT(Age)
FROM ages
WHERE ages.Age > 17 AND ages.Age < 25) AS '18-24',
(SELECT COUNT(Age)
FROM ages
WHERE ages.Age > 24 AND ages.Age < 31) AS 25-30',
(SELECT COUNT(Age)
FROM ages
WHERE ages.Age > 30 AND ages.Age < 36) AS '31-35',
(SELECT COUNT(Age)
FROM ages
WHERE ages.Age > 35) AS '> 35'
在此列(值)中,生日存储为字符串值,格式如下:02.10.1987 00:00:00 (DD.MM.YYY HH:mm:ss)。
在这个 Fields 表中,我有 3500 行。
数据如下所示:
02.10.1987 00:00:00
29.07.1967 12:33:11
02.10.1987 00:00:00
15.11.1959 00:00:00
07.11.1975 00:00:00
当我这样运行程序时,SQL 服务器返回以下错误:
从字符串转换日期和/或时间时转换失败
程序正常执行,如果我把Top 100000放在存储过程中,像这样:
WITH ages AS
(
SELECT TOP 100000 datediff(year, CONVERT(datetime, pf.Value, 104), pf.CreatedOn)
END as Age
FROM Fields pf
where pf.Value is not null
)
SELECT (select count(Age) FROM ages where ages.Age>17 and ages.Age<25) as '18-24',
(select count(Age) FROM ages where ages.Age>24 and ages.Age<31) as '25-30',
(select count(Age) FROM ages where ages.Age>30 and ages.Age<36) as '31-35',
(select count(Age) FROM ages where ages.Age>35) as '>35'
正如我所写,我只有 3500 行。
我所有的数据格式都正确,存储过程得到的都是非空值。
有人知道为什么会这样吗?为什么它可以与插入的 Top 一起使用,但没有它却不能?
SQL Server 所做的与内存分配有关吗?
【问题讨论】:
标签: sql-server stored-procedures