| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 443 人关注过本帖
标题:一个关于SQLserver临时表的问题
只看楼主 加入收藏
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1070
专家分:2613
注 册: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
来 自:火星
等 级:版主
威 望:37
帖 子:654
专家分:2535
注 册:2018-3-13
收藏
得分:20 
无解,只能在生成临时表后再执行一段设置临时表默认值约束的脚本代码

这家伙很懒,啥也没留下
2023-05-11 15:59
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:989
专家分:4966
注 册: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
来 自:火星
等 级:版主
威 望:37
帖 子:654
专家分:2535
注 册: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
等 级:版主
威 望:66
帖 子:1070
专家分:2613
注 册:2015-12-30
收藏
得分:0 
感谢以上回复
确实是想偷懒,如果只能使用正式表的创建语句来生成临时表的话,那还是插入时把每个字段都给值来的简单
另外,就算是能反查,也没法使用SQLserver菜单方式,还是要在程序里实现

2023-05-11 20:49
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:654
专家分:2535
注 册: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
等 级:版主
威 望:66
帖 子:1070
专家分:2613
注 册:2015-12-30
收藏
得分:0 
回复 6楼 csyx
感谢提供的方法,这样就会确保没问题了

我只是对临时表字段设定的继承有疑问,为什么只继承了一部分,我怕是我的方法有问题
2023-05-12 08:01
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1070
专家分:2613
注 册: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
快速回复:一个关于SQLserver临时表的问题
数据加载中...
 
   



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

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