注册 登录
编程论坛 VFP论坛

一个关于SQLserver临时表的问题

laowan001 发布于 2023-05-11 15:24, 140 次点击
数据都在远程服务器上,使用SQLserver数据库
数据库中的表的每个字段都有设定default和not null,如:alter table TableName add 字段名 varchar(20) default '' not null
向正式表中插入记录时,未涉及的字段都会按照default的定义赋值

操作
-- 先生成一个空的临时表
select * INTO #临时表名 from TableName where 1=2
向这个临时表中插入记录
问题来了,如果insert 命令只涉及了其中部分字段,则会报错:字段名X 不允许为空
从报错内容来看,临时表是继承了正式表的not null设定,但好像没继承default定义

问:生成临时表时应该怎么写才能完整继承正式表的相关设定
或者:完全不继承正式表的设定也可以(字段都允许空)


[此贴子已经被作者于2023-5-12 10:05编辑过]

7 回复
#2
csyx2023-05-11 15:59
无解,只能在生成临时表后再执行一段设置临时表默认值约束的脚本代码
#3
厨师王德榜2023-05-11 16:23
假定原表是这样创建的
CREATE TABLE tt1 (
    [id] int NOT NULL IDENTITY(1,1) PRIMARY KEY,
    [ddh] char(10) NOT NULL DEFAULT (''),
    [wsje] float NOT NULL DEFAULT ((0))
)

那么临时表也这样创建:
CREATE TABLE #tmp_11886 (
    [id] int NOT NULL IDENTITY(1,1) PRIMARY KEY,
    [ddh] char(10) NOT NULL DEFAULT (''),
    [wsje] float NOT NULL DEFAULT ((0))
)
这样就可以了,也就是说临时表不要像这样创建:  select * INTO #tmp_11886 from tt1 where 1=2
至于已知一个MSSQL表,如何反查它的DDL语句?  我一时找不到资料,但是我有印象,肯定是可以反查的.
#4
csyx2023-05-11 16:50
以下是引用厨师王德榜在2023-5-11 16:23:23的发言:
这样就可以了,也就是说临时表不要像这样创建:  select * INTO #tmp_11886 from tt1 where 1=2
至于已知一个MSSQL表,如何反查它的DDL语句?  我一时找不到资料,但是我有印象,肯定是可以反查的.

楼主这不想偷懒不是 ^-^
反查很简单,在 SSMS 里找到表,右击 > 编写表脚本 > 创建到 ...,然后爱到哪到哪,脚本中不光有字段的定义,还包括所有的字段描述和所有约束定义,该有的语句都有
楼主只用复制定义约束的那部分语句,把约束名批量替换下就行


[此贴子已经被作者于2023-5-11 16:53编辑过]

#5
laowan0012023-05-11 20:49
感谢以上回复
确实是想偷懒,如果只能使用正式表的创建语句来生成临时表的话,那还是插入时把每个字段都给值来的简单
另外,就算是能反查,也没法使用SQLserver菜单方式,还是要在程序里实现

#6
csyx2023-05-11 22:38
以下是引用laowan001在2023-5-11 20:49:57的发言:
如果只能使用正式表的创建语句来生成临时表的话,那还是插入时把每个字段都给值来的简单
另外,就算是能反查,也没法使用SQLserver菜单方式,还是要在程序里实现

1. 用不着用创建的语句,select into 就行
2. 也不用菜单方式,只是复制出定义约束的语句,最后跟生成临时表的语句一起发送就行

类似这样;
只有本站会员才能查看附件,请 登录

#7
laowan0012023-05-12 08:01
回复 6楼 csyx
感谢提供的方法,这样就会确保没问题了

我只是对临时表字段设定的继承有疑问,为什么只继承了一部分,我怕是我的方法有问题
#8
laowan0012023-05-12 10:04
SELECT id,shopcode,ordercode,denpyouno,quantity INTO #_6M50KVJ3J FROM 正式表名 WHERE 1=2
ALTER TABLE #_6M50KVJ3J add DEFAULT '' for [id]
ALTER TABLE #_6M50KVJ3J add DEFAULT '' for [shopcode]
ALTER TABLE #_6M50KVJ3J add DEFAULT '' for [ordercode]
ALTER TABLE #_6M50KVJ3J add DEFAULT '' for [denpyouno]
ALTER TABLE #_6M50KVJ3J add DEFAULT '' for [quantity]

insert into #_6M50KVJ3J (shopcode) values ('asd')
insert into #_6M50KVJ3J (ordercode) values ('111')
select * from #_6M50KVJ3J

drop table #_6M50KVJ3J

以上方法测试可行

二楼csyx版主说的正确

发现一个奇怪的现象:
对数值型字段,default ''居然能行,而且默认值还是数值

[此贴子已经被作者于2023-5-12 10:08编辑过]

1