消息8114:将数据类型varchar转换为数字时出错

时间:2011-04-06 19:14:05

标签: tsql dynamic-sql

我正在SSMS 2008中编写动态查询,我收到上述错误。造成这种情况的原因是什么?

我的查询:

SELECT TOP 10 *
FROM 
    ALL_COMPLAINTS A
JOIN 
    #TEMP5 B ON A.QXP_EXCEPTION_NO = B.QXP_EXCEPTION_NO 
                AND A.[LEVEL] = B.[LEVEL] 
                AND A.[QXP_REPORT_DATE] = B.[QXP_REPORT_DATE]
WHERE 
    A.QXP_REPORT_DATE >= CONVERT(DATETIME, '' + @FirstMonthDate + ' 00:00:00', 102) 
    AND 
    A.QXP_REPORT_DATE <= CONVERT(DATETIME, '' + @LastMonthDate + ' 23:59:59', 102) 
    AND 
    A.QXP_SHORT_DESC <> 'Design Control' AND A.LEVEL = ' + CAST(@TheLevel AS VARCHAR(5)) + ' 

我知道A.Level是数字的,我也知道如果我删除A.Level部分,我不会收到任何错误。但是,我不确定我是否正确地投射@TheLevel,因为这是动态SQL。

1 个答案:

答案 0 :(得分:1)

您的引号在最后一行搞砸了,您无法在同一语句中混合动态SQL和非动态SQL。还假设@TheLevel是一个数字,如果@TheLevel是一个char,你需要将它转换为数字(在这种情况下我假设为int)

SELECT TOP 10 *
FROM 
    ALL_COMPLAINTS A
JOIN 
    #TEMP5 B ON A.QXP_EXCEPTION_NO = B.QXP_EXCEPTION_NO 
                AND A.[LEVEL] = B.[LEVEL] 
                AND A.[QXP_REPORT_DATE] = B.[QXP_REPORT_DATE]
WHERE 
    A.QXP_REPORT_DATE >= CONVERT(DATETIME, '' + @FirstMonthDate + ' 00:00:00', 102) 
    AND 
    A.QXP_REPORT_DATE <= CONVERT(DATETIME, '' + @LastMonthDate + ' 23:59:59', 102) 
    AND 
    A.QXP_SHORT_DESC <> 'Design Control' AND A.LEVEL = @TheLevel

如果您需要动态部分,那么预先评估它然后将其键入非动态查询可能是一种好习惯