将varchar值转换为数据类型int时转换失败

时间:2013-04-29 14:41:02

标签: sql sql-server sql-server-2005

我的存储过程接受一个参数,它是一个日期时间。如果没有传递参数,我将其默认为getdate()函数:

ALTER PROCEDURE [dbo].[myexport]
(
    @start datetime = null
)
AS 
BEGIN
    SET NOCOUNT ON;
    set @start = isnull(@start, getdate())

当我运行没有参数的存储过程时,我的结果是正确的。当我传递一个日期参数时,我收到以下错误:

exec myexport '2013-04-22 00:00:00:00'

Msg 245, Level 16, State 1, Procedure myexport, line 16
Conversion failed when converting the varchar value '(-) 0mms' to data type int.

以下是我的@start日期的上下文:

select
    count(distinct pid),
    'Inpatient Hosp'
from
    form_names fn
        inner join form_items fi on fn.id = fi.form_name
        inner join form_records fr on fn.id = fr.form_name
        left outer join form_answers fa on fi.id = fa.form_item and fa.form_record = fr.id
where
    fn.name like '%Transfer of Health Information%'
    and dateadd(dd, 0, datediff(dd, 0, fr.date)) = dateadd(dd, 0, datediff(dd, 0, @start))
    and fi.text like '%date of return%'
    and fa.id is NULL

编辑 -

我的存储过程ID相当大,有很多子查询,但我认为我找到了有问题的查询:

select
    count(*),
    'PPD +'
from
    form_records fr
        inner join form_names fn on fn.id = fr.form_Name
        inner join form_items fi on fn.id = fi.form_name
        inner join form_answers fa on fr.id = fa.form_record
            and fa.form_item = fi.id
where
    fn.id = 3
    and fa.form_item = 30
    and fa.text not like '%neg%'
    and dateadd(dd, 0, datediff(dd, 0, fa.entered_date)) = dateadd(dd, 0, datediff(dd, 0, @start))
    and CAST(fa.text AS INT) >= 10

当我使用getdate()手动运行此查询时,我的结果是正确的,但当我使用'2013-04-22 00:00:'00运行时,我收到错误。

fa.entered_date的数据类型为datetime

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

我认为你添加了太多的00。

试试这个:exec myexport '2013-04-22 00:00:00'

答案 1 :(得分:1)

不确定您在上次查询时尝试做什么。但是,语法应该是

DATEADD (datepart , number , date )

你有

dateadd(dd, 0, datediff(dd, 0, @start))

DATEDIFF返回 INT

您需要更改查询

答案 2 :(得分:1)

使用明确的格式指定日期可能会有所帮助。使用例如

'20130422'

'2013-04-22T10:57:33.007'

其他任何事情都可能会产生歧义;例如在某些情况下,SQL Server会将2013-04-222013-04-22 10:57:33.007解释为来自第22个月的第4个日期并且转换失败。


另外,对于您的查询,我将其运行为:

and fr.date> = @start and fr.date < DATEADD(day,1,@start)

在查询运行之前设置@start

set @start = DATEADD(day,DATEDIFF(day,0,@start),0)

这意味着如果索引包含fr.date,则至少有可能使用该索引。