【问题标题】: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】:
      1. 不要使用以sp_前缀的存储过程,因为它是用于系统程序
      2. 如果您还没有已经在TSQL搜索本网站或谷歌为“动态搜索条件”
      3. 如果您尚未,搜索本网站或谷歌为“动态SQL”
      4. 日期字符串文字格式YYYYMMDD总是正确解释 LI>
      5. ,除非你有一个很好的理由不使用SELECT *
      6. 始终包括在对象名称的模式 LI>
      7. 的“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>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-17
        • 2017-12-07
        相关资源
        最近更新 更多