在动态过程中需要帮助

时间:2015-10-08 14:58:05

标签: sql-server sql-server-2008 tsql stored-procedures

我有一个开始日期和结束日期,所以如何使用它们来代替getdate()

我有一个代码,如果开始日期和结束日期之间的日期间隔小于30,则应显示开始日期和结束日期。相反,它显示错误 -

Explicit conversion from data type int to date is not allowed.

我不是在任何地方使用int,但它仍然显示我已尝试转换参数传递和其他事情,但它没有停止显示错误。

我的代码是 -

if object_id('ias_test_SCHEMA.week2','p') is not null
drop procedure ias_test_SCHEMA.week2;
go
create procedure ias_test_SCHEMA.week2(@startdate date,@enddate date) 
as
BEGIN
declare @datediff integer,
        @res varchar(30);

set @datediff = DATEDIFF(day, @startdate, @enddate);

if @datediff<=30 
begin
declare @stmt nvarchar(max),
        @stmt1 nvarchar(max);
set @stmt= N'SELECT @res=(DATENAME(DAY,convert(date,'+convert(nvarchar(20),@startdate)+'))  + '' '' + DATENAME(MONTH,convert(date,'+convert(nvarchar(20),@startdate)+')) + '' '' + DATENAME(YEAR,convert(date,'+convert(nvarchar(20),@startdate)+')))';
Execute sp_executesql @stmt, N'@res varchar output',
                             @res=@res output;
print 'The date is:' + @res;
set @stmt1= N'SELECT DATENAME(DAY,convert(date,'+convert(nvarchar(20),@enddate)+')) + '' '' + DATENAME(MONTH,convert(date,'+convert(nvarchar(20),@enddate)+')) + '' '' + DATENAME(YEAR,convert(date,'+convert(nvarchar(20),@enddate)+'))';
Execute sp_executesql @stmt1;
end;
end;
 go

我正按行执行 -

execute ias_test_SCHEMA.week2 '2015-10-03','2015-10-08';

但显示已成功编译,但在结果时未显示错误。我被困在这里! 请有人帮我解决一下吗?谢谢!

1 个答案:

答案 0 :(得分:0)

这些是您的代码生成的命令:

SELECT @res=(DATENAME(DAY,convert(date,2015-10-03))  + ' ' + DATENAME(MONTH,convert(date,2015-10-03)) + ' ' + DATENAME(YEAR,convert(date,2015-10-03)))
SELECT DATENAME(DAY,convert(date,2015-10-08)) + ' ' + DATENAME(MONTH,convert(date,2015-10-08)) + ' ' + DATENAME(YEAR,convert(date,2015-10-08))

问题在于动态字符串中内置转换内的日期缺失引号。

如果你跑:

select convert(date,2015-10-03);

你得到:

  

消息529,级别16,状态2,行1从数据类型显式转换   不允许使用int。

可以成功执行以下命令:

select convert(date,'2015-10-03');

解决方案是在构建动态查询时添加转义单引号:

set @stmt= N'SELECT @res=(DATENAME(DAY,convert(date,'''+convert(nvarchar(20),@startdate)+'''))  + '' '' + DATENAME(MONTH,convert(date,'''+convert(nvarchar(20),@startdate)+''')) + '' '' + DATENAME(YEAR,convert(date,'''+convert(nvarchar(20),@startdate)+''')))';