【问题标题】:TSQL -- Inserting Dates Into Dynamic SQLTSQL -- 将日期插入动态 SQL
【发布时间】:2010-10-17 00:57:29
【问题描述】:

考虑以下 TSQL:

SET @WhereClause1 = 'where a.Date > ' + @InvoiceDate

我收到日期/字符串转换错误。 @InvoiceDate 是一个日期时间变量。什么是正确的语法?

【问题讨论】:

    标签: tsql datetime date dynamic-sql


    【解决方案1】:

    这可能有效。

    SET @WhereClause1 = 'where a.Date > ''' + convert(varchar, @InvoiceDate) + ''''
    

    虽然如果值为 null 会引发错误。

    【讨论】:

    • 这不起作用,因为您必须用引号将日期(字符串内)括起来
    【解决方案2】:

    这将起作用:

    SET @WhereClause1 = 'where a.Date > ''' + cast(@InvoiceDate as varchar(100)) + ''''
    

    【讨论】:

    • 我希望我可以将两个答案标记为已批准,因为这个答案也有效。谢谢
    • 当我遇到麻烦时,我会选择一个并给其他人打分(向上箭头)(如果他们超过 1)。这并不意味着你必须这样做:)
    【解决方案3】:

    由于您首先将查询组合为字符串,因此我认为您需要将@InvoiceDate 转换为具有this 之类的字符串。 http://www.databasejournal.com/features/mssql/article.php/10894_2197931_1/Working-with-SQL-Server-DateTime-Variables-Part-Two---Displaying-Dates-and-Times-in-Different-Formats.htm

    【讨论】:

      【解决方案4】:

      ...您可能需要将日期字符串括在引号中。

      在调用例程中构造日期字符串实际上可能会更好,因为您应该在那里检查空值和其他验证。

      【讨论】:

        【解决方案5】:
        EXEC sp_executesql N'SELECT * FROM Orders WHERE a.Date > @date',
                           N'@date datetime',
                           @date = @InvoiceDate
        

        【讨论】:

          猜你喜欢
          • 2014-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-27
          • 2017-05-17
          • 2013-05-19
          • 2011-03-15
          相关资源
          最近更新 更多