Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 执行期间发生SQL代码显式转换错误_C#_Sql_Sql Server - Fatal编程技术网

C# 执行期间发生SQL代码显式转换错误

C# 执行期间发生SQL代码显式转换错误,c#,sql,sql-server,C#,Sql,Sql Server,我在尝试执行代码时遇到错误“不允许从数据类型int显式转换为date”。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 varch

我在尝试执行代码时遇到错误“不允许从数据类型int显式转换为date”。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
我相信这是比较日期的最后一行。临时表只包含字符串和最后一行,将其转换为日期并进行比较


提前谢谢

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

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

在设置
@sql
时,查询中的from关键字前面有额外的
选择语句remove”,“我建议不要像在存储过程中那样执行动态sql。相反,使用带有显式参数的sp_executesql—这样您就知道您不会受到SQL注入的影响<代码>(转换(日期,mt.actualNewDate,110)在转换(日期,++@fromDate++',110)和转换(日期,++@toDate++',110)之间)是一种非常低效的确认日期是否在两个日期之间的方法。将
mt.actualNewDate
的列类型更改为
Date
类型,并将@fromDate和@toDate更改为
Date
。然后在@fromDate和@toDate之间使用
mt.actualNewDate
(使用
sp_executesql
参数)。您好,删除逗号后,新的错误告诉您“不允许从数据类型int显式转换为日期”。因此,上面对您的问题的注释;并且,考虑问一个新问题。