【问题标题】:SQL code explicit conversion error during execution [closed]执行期间SQL代码显式转换错误[关闭]
【发布时间】:2018-06-04 16:06:30
【问题描述】:

我收到错误“不允许从数据类型 int 到日期的显式转换”。在尝试执行代码时。 SQL是

USE [xxDB]
GO

declare @currentMonth int = 1,
@currentYear int = 2014,
@newExpireMonth int =6,
@newExpireYear int =2018,
@actualDate varchar(30),
@fromDate varchar(30),
@toDate varchar(30)


declare @Sql varchar(8000)


begin

create table #MytempTab1 
        (
            actualNewDate varchar(30), 
            newUserId int              
        )

  insert into #MytempTab1
   select 
    (RIGHT( '00' + CAST(ISNULL(ss.ExpiryMonth, '01') as varchar(2)), 
          2)+'-01'+'-'+RIGHT('0000' + CAST(ISNULL(ss.ExpiryYear, '2014') as 
          varchar(4)), 4)) as actualNewDate, ss.UserId as newUserId

    from
    dbo.UserProfile u
    inner join dbo.webpages_UsersInRoles wur on u.UserId=wur.UserId
    inner join dbo.SpreedlySubscriber ss on u.UserId=ss.UserId      

  where 
    (wur.RoleId=4) 

end


  set @Sql= '
 select
  ss.FirstName as FirstName, ss.LastName as LastName,   
  ss.ExpiryMonth as ExpMonth, ss.ExpiryYear as ExpYear 

from dbo.UserProfile u
inner join dbo.webpages_UsersInRoles wur on u.UserId=wur.UserId
inner join dbo.SpreedlySubscriber ss on u.UserId=ss.UserId
inner join #MytempTab1 mt on ss.UserId= mt.newUserId
inner join dbo.[Order] odr on ss.OrderId=odr.OrderId


where (wur.RoleId=4) and '


set @fromDate =  RIGHT('00' + CAST(@currentMonth  as varchar(2)), 2) +'-01'+'-'+ RIGHT('0000' + CAST(@currentYear as varchar(4)), 4)
set @toDate=  RIGHT('00' + CAST(@newExpireMonth as varchar(2)), 2) +'-01'+'-'+ RIGHT('0000' + CAST(@newExpireYear as varchar(4)), 4)

set @Sql= @Sql+ '(CONVERT(date, mt.actualNewDate, 110) BETWEEN CONVERT(date, '+@fromDate+', 110) AND CONVERT(date, '+@toDate+', 110))'

 print (@Sql)
 EXEC(@Sql)
 drop table #MytempTab1

我相信这是比较日期的最后一行。临时表只创建字符串,最后一行将其转换为日期并进行比较。

提前致谢。

【问题讨论】:

  • 在设置 @sql 时,您在 select 语句中有额外的 ,
  • 删除查询中 from 关键字前的“,”
  • 我建议不要像在存储过程中那样执行动态 SQL。相反,使用带有显式参数的 sp_executesql - 这样您知道您可以安全地避免 SQL 注入。 stackoverflow.com/questions/28481189/…
  • (CONVERT(date, mt.actualNewDate, 110) BETWEEN CONVERT(date, '+@fromDate+', 110) AND CONVERT(date, '+@toDate+', 110)) 是一种确认日期是否介于两个日期之间的非常低效的方法。将mt.actualNewDate 的列类型更改为Date 类型 - 同时将@fromDate 和@toDate 更改为Date。然后使用mt.actualNewDate BETWEEN @fromDate AND @toDate(带有sp_executesql参数)。

标签: c# sql sql-server


【解决方案1】:

选择列表中有一个逗号结尾:

  set @Sql= '
 select
  ss.FirstName as FirstName, ss.LastName as LastName,   
  ss.ExpiryMonth as ExpMonth, ss.ExpiryYear as ExpYear, 
--                                                    ^

【讨论】:

  • 您好,删除逗号后,新错误提示“不允许从数据类型 int 到日期的显式转换。”
  • 因此,上述问题的cmets;并且,考虑提出一个新问题。
猜你喜欢
  • 2019-11-30
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
相关资源
最近更新 更多