【发布时间】:2015-10-02 13:36:13
【问题描述】:
我有一个应该计算一个人年龄的存储过程。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
alter PROCEDURE [dbo].[ageTest]
(
@curDate date
)
AS
BEGIN
SET NOCOUNT ON;
declare @sql nvarchar(max)
declare @params nvarchar (1000)
declare @age date
set @params = N' @curDate date , @age date output'
set @sql = '
declare @dif float
declare @ageRound int
declare @theAge varchar (100)
set @age = ''19890406''
set @theAge =(select (datediff (mm, @age , getdate())))
set @dif = @theAge % 12
set @ageRound = cast (@theAge as float)/12
select @ageRound as Years, @dif as months
'
set @sql = replace (@sql, '19890406', @curDate)
execute sp_executesql @sql, @params, @curDate, @age output
end
execute [dbo].[ageTest] '19511214'
我想要得到的是两列:
Years Months
63 10
问题是它循环。我可能应该从@sql 中删除选择并将其放在外面,然后我遇到了声明问题。想法?
编辑:不重复
【问题讨论】:
-
你为什么还要为此使用动态 sql?
-
只是为了好玩,我正在尝试自己了解更多信息。我只想能够执行它并传递一个日期。我正在努力为自己寻找新的挑战。这就是我今天要做的。那么,为什么不呢?否则你会怎么做?作为您传递日期的存储过程?
-
这不是重复的,我只是在30分钟前写了这个程序,没有看任何网站。好的,不得不谷歌演员,但就是这样\
-
您正在从内部调用该过程,因为您的过程后没有批处理分隔符。默认为 GO。
-
我会从动态 sql 中提取所有内容。而且我不会使用浮点数。浮点数据类型是一个近似值,您应该改用数字。而且存储过程应该很简单。
标签: sql sql-server stored-procedures sql-server-2012