隐式转换SQL

时间:2013-04-04 09:26:12

标签: sql sql-server

当我托盘在我的数据库中插入一些东西时,我总是会遇到这个奇怪的错误我应该工作,顺序应该也是正确的

我的查询

INSERT INTO [123].HolidayTracker.dbo.HtVacationDay
    ( Title, 
      FromDate, 
      UserId,
      ToDate )
SELECT 
      old.[userNote] AS Title,
      newUser.UserId,
      DATEADD(HOUR, 8, old.[holidayDate]) as FromDate,
      DATEADD(HOUR, 8, 
          DATEADD(SECOND, old.[hours] * 3600, old.[holidayDate])) as ToDate
  FROM [HolidayTracker].[dbo].[UserHoliday] old
  INNER JOIN 
      [HolidayTracker].[dbo].HTUser oldUser 
      ON old.htUser_htUserId = oldUser.htUserId
  INNER JOIN 
      [ch-s-0008180].[HolidayTracker].[dbo].HtUser newUser 
      ON oldUser.email = newUser.email

错误消息

  

Msg 257,Level 16,State 3,Line 1从数据类型隐式转换   不允许使用datetime到int。使用CONVERT函数运行它   查询。

感谢您的帮助和快速回答

2 个答案:

答案 0 :(得分:2)

INSERT INTO [123].HolidayTracker.dbo.HtVacationDay(Title,UserId,FromDate,ToDate)
....

您的插入字段为

(Title,FromDate,UserId,ToDate)

和数据

old.[userNote],
,newUser.UserId
,DATEADD....
,DATEADD....

错误是SELECT中的第3个表达式(datetime)被强制进入UserId(int)列。


  

但现在我得到这个新错误字符串或二进制数据将被截断。

为此,您需要缩短old.[userNote]以匹配HtVacationDay.Title列的最大尺寸,例如

 LEFT(old.userNote, 10)

答案 1 :(得分:0)

我认为Insert语句和select语句的顺序不正确,

你应该

  

SELECT old。[userNote] AS Title,DATEADD(HOUR,8,old。[holidayDate])as as   从日期         ,newUser.UserId,DATEADD(HOUR,8,DATEADD(第二,旧。[小时] * 3600,旧。[holidayDate]))作为ToDate

     

FROM [HolidayTracker]。[dbo]。[UserHoliday] old ....

OR

您可以将插入语句更改为

  

INSERT INTO [123] .HolidayTracker.dbo.HtVacationDay       (标题,         用户身份,         从日期,         ToDate)

由于