declare @orderwhere varchar(5000)
declare @Pdate DateTime
set @orderwhere = 'Product.ProductID = 1 And Product.ProductDate=' + @Pdate
exec('select Product.ProductID
from Product
where ' + @orderwhere)
我得到这些错误:
第241级第1条第4行第241条消息
从字符串转换日期和/或时间时转换失败。
答案 0 :(得分:1)
编辑:
注意:此答案涉及原始问题,该问题有一行DECLARE @Pdate DATETIME = '1001-01-01'
和错误消息“从字符串转换日期和/或时间时转换失败。”在里面。
摘自datetime
的手册:
日期范围[:] 1753年1月1日至9999年12月31日
因此,对于datetime
来说,您的一年肯定是早。
您可以尝试使用范围从0001-01-01到9999-12-31的datetime2
或仅使用与datetime2
相同范围的date
日期部分,而不是时间部分)。
答案 1 :(得分:0)
您需要将@Pdate
转换为varchar才能进行字符串连接。
set @orderwhere = 'Product.ProductID = 1 And Product.ProductDate= '''+ cast(@Pdate as varchar) + ''''
否则,将其视为加法运算。您还需要添加多余的撇号,否则执行失败。这就是为什么在执行之前先进行PRINT
调试语句总是很好的原因。
示例:
declare @orderwhere varchar(5000)
declare @Pdate date = '20160101'
set @orderwhere = 'Product.ProductID = 1 And Product.ProductDate= ''' + cast(@Pdate as varchar) + ''''
print('select Product.ProductID
from Product
where ' + @orderwhere)
或者,使用datetime
declare @orderwhere varchar(5000)
declare @Pdate datetime = '20160101'
set @orderwhere = 'Product.ProductID = 1 And Product.ProductDate= ''' + convert(varchar,@Pdate,120) + ''''
print('select Product.ProductID
from Product
where ' + @orderwhere)
答案 2 :(得分:0)
您必须将@pdate转换为varchar
declare @orderwhere varchar(5000)
declare @Pdate DateTime
declare @Pdatec varchar(50)
set @Pdatec = CAST(@Pdate as varchar(50))
set @orderwhere = 'Product.ProductID = 1 And Product.ProductDate= '''+ @Pdatec + ''''
exec('select Product.ProductID
from Product
where ' + @orderwhere)
并添加引号。 尝试通过打印结果来测试动态查询。