【问题标题】:I get SQL error converting data type varchar to date将数据类型 varchar 转换为日期时出现 SQL 错误
【发布时间】:2012-03-14 20:51:04
【问题描述】:

我明白了

消息 8114,级别 16,状态 5,过程 DetayliArama,第 0 行错误 将数据类型 varchar 转换为日期。

错误。有什么想法吗?

这是我的存储过程:

ALTER proc [dbo].[DetayliArama]
(
@ilktarih date = null,
@sontarih date = null,
@islem nvarchar(10) = null,
@birim int = null
)
as
declare @sorgu nvarchar (max)
set @sorgu = 'select KasaID,Aciklama,Tutar,Tarih,Islem,IsDeleted,KasalarID 
from KasaTable where IsDeleted=0 and KasalarID='+CONVERT(varchar(10),@birim)+' AND ' 
if (@islem is not null) 
    set @sorgu += 'Islem like ''%'+@islem+'%'' and '
if (@ilktarih is not null) 
    set @sorgu+='Tarih between '+convert(datetime,@ilktarih,120)+' 
        and '+convert(datetime,@sontarih ,120)+' and '                      
set @sorgu+='1=1 order by Tarih DESC'
exec (@sorgu)

【问题讨论】:

  • 我通常通过将逻辑作为独立 sql 运行并检查您尝试转换的变量来调试这类事情。如果您这样做,您尝试转换为日期的 varchar 值是什么?
  • 另外你应该使用exec sp_executesql,而不是exec()sqlblog.com/blogs/aaron_bertrand/archive/2011/09/17/…

标签: sql-server datetime


【解决方案1】:

(a) 您需要用单引号将您的日期/日期时间变量括起来。否则查询结果如下:

WHERE Tarih BETWEEN 2012-03-14 ...

它被评估为一个数字表达式,所以最终是:

WHERE Tarih BETWEEN 1995 ... -- and no that's not the year

(b) 您不应该转换为 DATETIME。试试:

set @sorgu+='Tarih between '''+convert(CHAR(8),@ilktarih,112)+'''
  and '''+convert(CHAR(8),@sontarih ,112)+''' and '

但是,我完全不明白您为什么要使用动态 SQL。为什么不:

ALTER PROCEDURE [dbo].[DetayliArama]
  @ilktarih DATE         = NULL,
  @sontarih DATE         = NULL,
  @islem    NVARCHAR(10) = NULL,
  @birim    INT          = NULL
AS
BEGIN
   SET NOCOUNT ON;

    SELECT KasaID, Aciklama, Tutar, Tarih, Islem, IsDeleted, KasalarID 
    FROM dbo.KasaTable 
    WHERE IsDeleted = 0 
    AND KasalarID = @birim
    AND Islem LIKE COALESCE('%'+@islem+'%', Islem)
    AND Tarih BETWEEN COALESCE(@ilktarih, '19000101') 
        AND COALESCE(@sontarih, '20301231');
END
GO

在某些情况下,使用动态 SQL 可以更有效地避免由于参数不同而导致的错误计划。但我认为当你遇到它时应该处理它。

【讨论】:

  • 所以我是 sql 新手,希望你能解决我的问题并向我展示另一种方式
猜你喜欢
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多