日期:2014-05-18  浏览次数:20312 次

关于数据类型的转换问题
现在有两张表一张是表类型,一张是公农历对照表:
SQL code

IF OBJECT_ID('CalendarReference') IS NOT NULL 
DROP TABLE CalendarReference;
GO
--日历对照表(公历农历对照表)
CREATE TABLE CalendarReference
( Id INT IDENTITY (1,1) NOT NULL ,
  CalendarDate DATETIME NOT NULL ,
  LunarDate DATETIME NOT NULL
  );
--插入数据
INSERT INTO CalendarReference VALUES ('20130210','20130101');
--创建表类型
GO
IF TYPE_ID('tyWeekday') IS NOT NULL
DROP TYPE tyWeekday;
GO
CREATE TYPE tyHoliday AS TABLE 
(Id INT IDENTITY(1,1),
 HolidayDate DATETIME); 


在SQL Server2008 英文版 和在 SQL Server 2008 SP1 中文简体版 分别运行下面的代码
SQL code

declare @d char(10),
        @tyh AS tyHoliday;
select @d=CalendarDate from CalendarReference where LunarDate='20130101';
select @d;
INSERT INTO @tyh  VALUES (@d);
SELECT * FROM @tyh;


在SQL Server2008 英文版里会报错:
Msg 242, Level 16, State 3, Line 5
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
但是在SQL Server 2008 SP1 中文简体版 里不报错。
通过调试我发现在SQL Server2008 英文版里 @d的值为:Feb 10 201, 所以插入到@tyh会报错,
但是在SQL Server 2008 SP1 中文简体版里@d的值为:02 10 2013,插入时没报错。
这都是因为时间类型转换为CHAR类型时处理不一样。
请问下高手这种情况应该怎样处理??



------解决方案--------------------
楼主莫急,既然找到问题就好解决。
可用下面的方法转换一下:
语法
使用 CAST:

CAST ( expression AS data_type ) 

使用 CONVERT:

CONVERT (data_type[(length)], expression [, style])

--例子
-- Use CAST.
USE pubs
GO
SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales
FROM titles
WHERE CAST(ytd_sales AS char(20)) LIKE '3%'
GO

-- Use CONVERT.
USE pubs
GO
SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales
FROM titles
WHERE CONVERT(char(20), ytd_sales) LIKE '3%'
GO

这样就行了吗,你参考这个改一下你的代码就ok了。

祝福你成功。




------解决方案--------------------
My sql server was just in SQL2008R2 English version.
SQL code

IF OBJECT_ID('CalendarReference') IS NOT NULL 
DROP TABLE CalendarReference;
GO
--日历对照表(公历农历对照表)
CREATE TABLE CalendarReference
( Id INT IDENTITY (1,1) NOT NULL ,
  CalendarDate DATETIME NOT NULL ,
  LunarDate DATETIME NOT NULL
  );
--插入数据
INSERT INTO CalendarReference VALUES ('20130210','20130101');
--创建表类型
GO
IF TYPE_ID('tyWeekday') IS NOT NULL
DROP TYPE tyWeekday;
GO
CREATE TYPE tyHoliday AS TABLE 
(Id INT IDENTITY(1,1),
 HolidayDate DATETIME); 


declare @d char(10),
        @tyh AS tyHoliday;
select @d=convert(varchar(30),CalendarDate,120) from CalendarReference where LunarDate='20130101';
INSERT INTO @tyh  VALUES (@d);
SELECT * FROM @tyh;

-- result
Id          HolidayDate
----------- -----------------------
1           2013-02-10 00:00:00.000