Tsql Msg 8114:将数据类型varchar转换为数字时出错

Tsql Msg 8114:将数据类型varchar转换为数字时出错,tsql,dynamic-sql,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_

我在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。

您的引用在最后一行中被弄乱了,您不能在同一语句中混合使用动态SQL和非动态SQL。还假设@TheLevel是一个数字,如果@TheLevel是一个字符,那么您需要将其转换为我在本例中假设的数字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

如果您需要一个动态部分,那么最好先对其进行预评估,然后将其输入非动态查询中

如果a.LEVEL是数字,它怎么能等于字符串`+CAST@TheLevel作为VARCHAR5+`?您在查询中遗漏了什么吗?尽管您说了最后一句话,但这看起来不像动态SQL!在动态SQL中,构造整个字符串,然后执行它。看起来您只是在将包含TSQL片段的随机字符串放入查询中,并希望它能正常工作?我也尝试将CAST0作为NUMERIC10,0,但收到了相同的错误消息。@Martin,我不了解u。这怎么会不完整呢?没关系,我现在修好了。以下是新代码: