【问题标题】:Procedure failed to run shows error: Conversion failed when converting date and/or time from character string程序运行失败显示错误:从字符串转换日期和/或时间时转换失败
【发布时间】:2010-08-18 08:27:13
【问题描述】:
我写了一个简单的程序:
CREATE PROCEDURE [dbo].[sp_GetPublishedDocs2]
@FromDate as Datetime
AS
BEGIN
DECLARE @strSQL VARCHAR(5000)
SET @strSQL='SELECT * From Task WHERE 1=1 '
IF @FromDate <>'1/1/1900'
SET @strSQL = @strSQL + ' AND Task.CreatedDate >= '+Cast(@FromDate as Datetime)
EXEC(@strSQL)
END
当我传递参数 '1/1/1900' 时它运行成功,但是当我传递任何其他日期时它显示:从字符串转换日期和/或时间时转换失败。
有没有人可以帮助我...
提前致谢。
【问题讨论】:
标签:
sql-server
database
datetime
comparison
【解决方案1】:
您应该将 @FromDate 转换为 varchar,因为您正在执行字符串连接。
CREATE PROCEDURE [dbo].[sp_GetPublishedDocs2]
(
@FromDate as Datetime
)
AS
BEGIN
DECLARE @strSQL VARCHAR(5000)
SET @strSQL = 'SELECT * From Task WHERE 1=1 '
IF @FromDate <>'1/1/1900'
BEGIN
SET @strSQL = @strSQL + ' AND Task.CreatedDate >= ''' + Cast(@FromDate as varchar) + ''''
END
EXEC(@strSQL)
END
尽量避免SELECT * FROM。显式定义所有列会更快。
提示:对于测试,您可以使用PRINT 支持EXEC 来查看生成的sql。
编辑:您可以在这里使用VARCHAR(MAX)...
【解决方案2】:
- 不要使用以sp_前缀的存储过程,因为它是用于系统程序
- 如果您还没有已经在TSQL搜索本网站或谷歌为“动态搜索条件”
- 如果您尚未,搜索本网站或谷歌为“动态SQL”
- 日期字符串文字格式YYYYMMDD总是正确解释 LI>
- ,除非你有一个很好的理由不使用SELECT *
- 始终包括在对象名称的模式 LI>
- 的“2”在你的程序名的末尾是code smell表明您可能不被处理的源代码版本和部署干净 LI>
和最后但并非最不重要,保持它的简单,如果你可以: P>
CREATE PROCEDURE [dbo].[usp_GetPublishedDocs2]
(
@FromDate as Datetime
)
AS
BEGIN
if @FromDate = '19000101'
begin
select * from dbo.Task
end
else
begin
select * from dbo.Task where CreatedDate >= @FromDate
end
END
一点的研究动态搜索条件会告诉你其他可能的方式来实现这一点,如果你需要有更复杂的搜索条件,这将是有益的。 P>