SQL2008不兼容SQL2000语法,请高人指点。(之前的问题描述中有误,无法编辑,重新发帖。)

linfei_z 2011-01-04 03:16:48
以前数据库一直使用SQL2000,但是现在购买SQL2000正版的已经少了。客户只能买SQL2005或者SQL2008
现在有个客户购买了SQL2008 R2,把数据库从SQL2000升级到了SQL2008 R2
现在发现有些语法在SQL2008R2中不通过。
如:
在过程中有这样一段:
SELECT a1='11',a2='ccc',* into #A from B
INSERT INTO #A(a1,a2) SELECT '22','adf'
在SQL2000中OK。
但是现在升级到SQL2008后执行这个过程就出问题了。
提示有字段不能插入NULL值。

请高人指教如何解决。

我现在知道的办法是:1)在过程中做个游标来获取#A的字段修改每个字段允许为NULL。
2)当然您也可以直接update tempdb..syscolums里isenablenull=1,但是这个好像不能直接UPDATE,需要权限。
3)就是请教高人有没有比较效率高的办法。前面2个办法是每次执行这个过程都要去Alter表或者Update表。

(目前,本人测试SQL2000很多语法与SQL2008兼容有问题。)
...全文
256 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
linfei_z 2011-01-04
  • 打赏
  • 举报
回复
分不多。只能给一个人。谢谢大家啊。我还是调整把他规范起来吧。反正都是我要改的。
linfei_z 2011-01-04
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 haiwer 的回复:]
引用 10 楼 linfei_z 的回复:
引用 9 楼 haiwer 的回复:
5楼的方法如果验证了可行的话也是可以的

5楼的是可以。但是我在into #A 的时候使用的事 * ,*代表所有的字段。如果用5楼的提示说字段数量不符合。必须按字段的数量插入对应数量的NULL。这样不是和我一个一个的写字段没区别?

这你都想省?
你就是因为以前的人省事了你才这么麻烦
*的写法本来就不……
[/Quote]
大哥,我知道这样是不好的,问题是这个脚本太长了一个个改要花很长的时间,客户急查报表。
这个脚本不是我写的,同事写的,现在他不搞了。我来改也是个麻烦事。
guguda2008 2011-01-04
  • 打赏
  • 举报
回复
去掉NOT NULL约束
昵称被占用了 2011-01-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 linfei_z 的回复:]
引用 9 楼 haiwer 的回复:
5楼的方法如果验证了可行的话也是可以的

5楼的是可以。但是我在into #A 的时候使用的事 * ,*代表所有的字段。如果用5楼的提示说字段数量不符合。必须按字段的数量插入对应数量的NULL。这样不是和我一个一个的写字段没区别?
[/Quote]
这你都想省?
你就是因为以前的人省事了你才这么麻烦
*的写法本来就不规范,在我这里这么写是扣绩效的。
飘零一叶 2011-01-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 linfei_z 的回复:]
引用 9 楼 haiwer 的回复:
5楼的方法如果验证了可行的话也是可以的

5楼的是可以。但是我在into #A 的时候使用的事 * ,*代表所有的字段。如果用5楼的提示说字段数量不符合。必须按字段的数量插入对应数量的NULL。这样不是和我一个一个的写字段没区别?
[/Quote]
那就用海爷的方法,把原表里面NOT NULL的列强制转换下。
linfei_z 2011-01-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 haiwer 的回复:]
5楼的方法如果验证了可行的话也是可以的
[/Quote]
5楼的是可以。但是我在into #A 的时候使用的事 * ,*代表所有的字段。如果用5楼的提示说字段数量不符合。必须按字段的数量插入对应数量的NULL。这样不是和我一个一个的写字段没区别?
昵称被占用了 2011-01-04
  • 打赏
  • 举报
回复
5楼的方法如果验证了可行的话也是可以的
Shawn 2011-01-04
  • 打赏
  • 举报
回复
SELECT a1=NULL,a2=NULL,* INTO #A FROM B
UPDATE #A SET a1='11',a2='ccc'

INSERT INTO #A(a1,a2) SELECT '22','adf'
昵称被占用了 2011-01-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qianjin036a 的回复:]
2008里临时表也继承了原表的NULL属性?貌似不大可能吧!
[/Quote]
2005就这样
linfei_z 2011-01-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 haiwer 的回复:]
不是发过帖了吗


SQL code
SELECT a1='11',a2='ccc'
,(b.col1 * 1) as col1 --数字
,cast(b.col2 as nvarchar(30)) as col2 --字符
,col3 -- 可空字段不必变换
,...
into #A
from B

INSERT IN……
[/Quote]
谢谢,之前的语法描述有问题,大家都针对我的语法去了。不好意思。
飘零一叶 2011-01-04
  • 打赏
  • 举报
回复
原帖的8楼解释的已经很清楚了,之所以出现这个错误。
是以意图向一个NOT null列插入NULL值导致。在sql2005 sql2008中微软修正了2000中的这个BUG,
使用select into,新表将沿用原表的列名称,数据类型,可控性,INDENTITY属性
create table tb
(
id int,
info varchar(10),
map int,
type varchar(10) not null
)
insert into tb
select 1,'a',2,'dd' union all
select 1,'b',2,'cc' union all
select 1,'c',2,'ccc' union all
select 2,'e',3,'cce' union all
select 2,'f',3,'ccf'

--解决方法
select id,info,map,type into #t from tb union all select null,null,null,null

delete from #t where id is null

insert into #t(id,info)
select 3,'222'
--插入成功

昵称被占用了 2011-01-04
  • 打赏
  • 举报
回复
用cast是通用的,可以去掉not null和标识列属性
linfei_z 2011-01-04
  • 打赏
  • 举报
回复
这个是千真万确的。
昵称被占用了 2011-01-04
  • 打赏
  • 举报
回复
不是发过帖了吗

 SELECT a1='11',a2='ccc'
,(b.col1 * 1) as col1 --数字
,cast(b.col2 as nvarchar(30)) as col2 --字符
,col3 -- 可空字段不必变换
,...
into #A
from B

INSERT INTO #A(a1,a2) SELECT '22','adf'
-晴天 2011-01-04
  • 打赏
  • 举报
回复
2008里临时表也继承了原表的NULL属性?貌似不大可能吧!

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧