【发布时间】: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