存储过程tsql中的日期转换

时间:2017-01-25 10:34:23

标签: sql sql-server tsql c#-4.0

我有一个datetime类型的列,我通过将两个局部变量声明为@From datetime and @To datetime来在我的存储过程中使用,但无论我做什么我都会得到错误,或者它只是运行存储过程而没有返回任何记录(完全空白)。

set @mySql ='
select * from abc where (MyDATE between '''+ cast(@From as datetime) +''' and '''+ cast(@To as datetime)+''')'

3 个答案:

答案 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语句。