标题:一个关于SQLserver临时表的问题
只看楼主
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
结帖率:100%
已结贴  问题点数:20 回复次数:7 
一个关于SQLserver临时表的问题
数据都在远程服务器上,使用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编辑过]

搜索更多相关主题的帖子: 设定 临时表 继承 SQLserver 字段 
2023-05-11 15:24
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:20 
无解,只能在生成临时表后再执行一段设置临时表默认值约束的脚本代码
2023-05-11 15:59
厨师王德榜
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:183
帖 子:942
专家分:4724
注 册:2013-2-16
得分:0 
假定原表是这样创建的
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语句?  我一时找不到资料,但是我有印象,肯定是可以反查的.
2023-05-11 16:23
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:0 
以下是引用厨师王德榜在2023-5-11 16:23:23的发言:
这样就可以了,也就是说临时表不要像这样创建:  select * INTO #tmp_11886 from tt1 where 1=2
至于已知一个MSSQL表,如何反查它的DDL语句?  我一时找不到资料,但是我有印象,肯定是可以反查的.

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


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

2023-05-11 16:50
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:0 
感谢以上回复
确实是想偷懒,如果只能使用正式表的创建语句来生成临时表的话,那还是插入时把每个字段都给值来的简单
另外,就算是能反查,也没法使用SQLserver菜单方式,还是要在程序里实现

2023-05-11 20:49
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:0 
以下是引用laowan001在2023-5-11 20:49:57的发言:
如果只能使用正式表的创建语句来生成临时表的话,那还是插入时把每个字段都给值来的简单
另外,就算是能反查,也没法使用SQLserver菜单方式,还是要在程序里实现

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

类似这样;

2023-05-11 22:38
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:0 
回复 6楼 csyx
感谢提供的方法,这样就会确保没问题了

我只是对临时表字段设定的继承有疑问,为什么只继承了一部分,我怕是我的方法有问题
2023-05-12 08:01
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:0 
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编辑过]

2023-05-12 10:04



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-512170-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.051127 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved