我有一个datetime类型的列,我通过将两个局部变量声明为@From datetime and @To datetime
来在我的存储过程中使用,但无论我做什么我都会得到错误,或者它只是运行存储过程而没有返回任何记录(完全空白)。
set @mySql ='
select * from abc where (MyDATE between '''+ cast(@From as datetime) +''' and '''+ cast(@To as datetime)+''')'
答案 0 :(得分:2)
唯一正确的"这样做的方法是在动态SQL中保留它们作为参数。例如:
set @mySql =N'select * from abc where MyDATE between @from and @to';
exec sp_executesql @mySql, N'@from datetime, @to datetime', @fromOuter, @toOuter;
这可以使它们在动态代码中正确键入 ,并避免格式化问题和SQL注入风险。请注意,动态代码内外的名称不需要匹配,如上例所示(@from
和@to
是动态代码中的名称; @fromOuter
和{{ 1}}是调用代码中的名称。
请注意,如果传递的参数多于实际使用的参数,则无关紧要(对于动态过滤方法,这是很正常的。)
答案 1 :(得分:1)
尽可能尝试将数据保存在适当类型的变量中。
例如,您可以在这里:
--@From and @To are declared previously as datetimes
set @mySql ='select * from abc where (MyDATE between @From and @To)'
--Other code that constructs/works on @mySQL
--Finally, run the dynamic sql:
EXEC sp_executesql @mySql,
'@From datetime,@To datetime`,
@From,
@To
所有内容都应该可以正常运行,因为您不会在字符串和datetime
之间来回切换,而是那些转换会导致出现格式化问题。< / p>
答案 2 :(得分:0)
这里的问题是,在构建动态SQL时,您希望将参数转换为DateTime。
您实际上应该做的是避免使用强制转换。将参数设置为日期时间并存储所需的值,然后再使用它们来构建动态SQL语句。