邪恶八进制信息安全团队技术讨论组's Archiver

月亮 2007-11-29 16:03

[讨论]数据库表里大量数据一次性写入问题

议题作者:月亮
信息来源:邪恶八进制信息安全团队([url]www.eviloctal.com[/url])

我现在操作的位置是:
Microsoft SQL Server 2000
企业管理器
sql 查询分析器

我首先
[code]
create database student
[/code]
建立了一个数据库名字为student


然后在student里面建立一个新表
[code]use student
create table s
(
  sno char(5) not null primary key,
  sn varchar(8) not null ,
  sex char(2) not null check (sex in ('boy','girl')),
  age int not null check (age>0),
  dept varchar(20),
  constraint sn_u unique(sn)
)
[/code]

[quote]
学号  姓名  性别  年龄  系别
(sno) (sn) (sex) (age) (dept)
s1  李涛  boy  19  信息
s2  王林  girl  18  计算机
s3  陈高  girl  21  自动化
s4  张杰  boy  17  自动化
s5  吴小莉  girl  19  信息
s6  徐敏敏  girl  20  计算机
[/quote]

我现在要在这个新建的表里写入这些

[code]
insert into s values
(
  's1','litao','boy','19','xinxi'
)
[/code]
……………………

老师说只能这样一行一行的写入
就是说只能:
[code]
insert into s values
(
  's1','litao','boy','19','xinxi'
)
[/code]
…………
可一行一行的写入太累了,所以请问各位大大,有没有办法直接一下子将那个表里的数据全部写入?

我不想一行一行的写入
想把上面的那个表一次性全部写进去能做到吗?

ninty 2007-12-2 20:58

[code]
学号  姓名  性别  年龄  系别
(sno) (sn) (sex) (age) (dept)
s1  李涛  boy  19  信息
s2  王林  girl  18  计算机
s3  陈高  girl  21  自动化
s4  张杰  boy  17  自动化
s5  吴小莉  girl  19  信息
s6  徐敏敏  girl  20  计算机
[/code]
这些东西是在文本文件里还是在什么地方?
如果是在文本文件里的话。好像只能一行一行加吧 你也可以自己写个程序去加。
如果是在access或者excel这样的文件里。试试openrowset

月亮 2007-12-2 23:40

openrowset
你是说要用一段代码实现对吗?
你能那那段代码写出来看下吗?
最好能用C写
呵呵,
这是我的一个小小的求助!我现在还在踉踉跄跄的学,所以这么简单的sql问题都不能解决
……
如果能帮助我,就先谢谢了!

bink 2007-12-3 10:18

[s:265]

那天我可问过你咯,如果你TXT里是按照固定格式写的数据,我帮你写个程序生成SQL语句,然后你到查询分析器里执行就可以了,至于固定格式么,我用最简单的方法说:
假设我写的程序为:
每次读取一行;
每行由四个空格分开,分成5个段落,5个段落的顺序分别是第一段落学号,第二段落名字。。。。

PS:明白?如果不明白就诚实的交代,么要装啊,要装去下面的“装吧”

月亮 2007-12-3 14:53

[s:66]
好啊,那你写完的代码用球球发我吧!什么语言写都成,只要能用。嘿嘿
sp:我木装啊! [s:50]
像这样的问题解决用vb最方便吗?

silenceshell 2007-12-3 15:27

用多句插入可以吧,为什么是只能一句呢?

insert into s values(sno,sn,sex, age ,dept,constraint )
select 's1','litao','boy','19','xinxi' union
select 's12','litao2','boy2','192','xinxi2' union


关键字合并进行插入

月亮 2007-12-3 20:22

[quote]引用第5楼silenceshell于2007-12-03 15:27发表的 :
用多句插入可以吧,为什么是只能一句呢?

insert into s values(sno,sn,sex, age ,dept,constraint )
select 's1','litao','boy','19','xinxi' union
select 's12','litao2','boy2','192','xinxi2' union
.......[/quote]

你实验一下就发现了
只要字符没有超出限制
单独用sql语句应该是无法实现多语句插入的
必须借助其他语言
否则我也不会来问这个问题啦
嘿嘿
不过谢谢你的指点

pub!1c 2007-12-4 14:16

写个存储过程就可以了。
insert into xx (field1,field2) select x from table2;
select into 也可以批量.

silenceshell 2007-12-4 22:05

[quote]引用第6楼月亮于2007-12-03 20:22发表的 :


你实验一下就发现了
只要字符没有超出限制
单独用sql语句应该是无法实现多语句插入的
.......[/quote]


你这个问题没有其他限制吧?
我没有去试验,我曾经做过类似的啊,你去试验了吗?

伤心的鱼 2007-12-4 23:26

哎,LZ为什么就不去GOOGLE搜搜呢
你们老师也是误导人
MSSQL功能这么强,不至于连这点事都解决不了

说2个解决方法,都是超级简单
首先如果你在企业管理器里操作的话,你在你要导入数据的数据库上单击右键-任务-导入数据
数据源那里选择文本文件,分隔符选择空格,NEXT,NEXT,NEXT。。。OK

第二如果你想用SQL语句,参考这篇文章

<<单表导入/导出文本文件>>

/*--实现数据导入/导出的存储过程

可以实现导入/导出 指定表 到文本文件
支持自定义行/列分隔符

--邹建 2003.07--*/

/*--调用示例
导出调用示例
--导出指定表,这里指定导出表:地区资料
exec file2table @#zj@#,@#@#,@#@#,@#c:\zj.txt@#,@#xzkh_new..地区资料@#,@rowsplit=@#,@#

导入调用示例
--导入指定表,这里指定导入表:地区资料
exec file2table @#zj@#,@#@#,@#@#,@#c:\zj.txt@#,@#xzkh_sa..地区资料@#,0
--*/

if exists(select 1 from sysobjects where name=@#File2Table@# and objectproperty(id,@#IsProcedure@#)=1)
drop procedure File2Table
go

create procedure File2Table
@servername varchar(200) --服务器名
,@username varchar(200) --用户名,如果用NT验证方式,则为空@#@#
,@password varchar(200) --密码
,@filename varchar(1000) --目录名+文件名
,@tbname varchar(500)=@#@# --数据库..表名
,@isout bit=1  --1为导出(默认),0为导入
,@fdsplit varchar(10)=@#\t@# --字段分隔符,默认为制表符
,@rowsplit varchar(10)=@#\n@# --记录分隔符,默认为回车符
as
declare @sql varchar(8000)

set @sql=@#bcp "@#+@tbname
+case when @isout=1 then @#" out@# else @#" in@# end
+@# "@#+@filename+@#" /c@# +@# /S"@#+@servername
+case when isnull(@username,@#@#)=@#@# then @#@#
else @#" /U"@#+@username end
+@#" /P"@#+isnull(@password,@#@#)+@#"@#
+@# /t"@#+@fdsplit+@#"@#
+@# /r"@#+@rowsplit+@#"@#

exec master..xp_cmdshell @sql
go


OK,不要光想着select insert,随便搜搜就有解决办法了: |

伤心的鱼 2007-12-4 23:27

补充一下,字段那里可以自己设置,导入的时候先把除了字段内容的其他东西删除掉.比如你TXT开头的字段名
留下纯内容,或者在导入数据那里把屏蔽第一行选择上,
本地只有SQL2005.说得不详细,自己去看一下就懂了

月亮 2007-12-5 18:59

[quote]引用第9楼伤心的鱼于2007-12-04 23:26发表的 :
首先如果你在企业管理器里操作的话,你在你要导入数据的数据库上单击右键-任务-导入数据
数据源那里选择文本文件,分隔符选择空格,NEXT,NEXT,NEXT。。。OK.......[/quote]

txt文本文件里面的是不是
[code]
&#39;s1&#39;,&#39;李涛&#39;,&#39;B&#39;,&#39;19&#39;,&#39;信息&#39;,
&#39;s2&#39;,&#39;王林&#39;,&#39;G&#39;,&#39;18&#39;,&#39;计算机&#39;,
&#39;s3&#39;,&#39;陈高&#39;,&#39;G21&#39;,&#39;自动化&#39;,
&#39;s4&#39;,&#39;张杰&#39;,&#39;B17&#39;,&#39;自动化&#39;,
&#39;s5&#39;,&#39;吴小莉&#39;,&#39;G19&#39;,&#39;信息&#39;,
&#39;s6&#39;,&#39;徐敏敏&#39;,&#39;G20&#39;,&#39;计算机&#39;,
[/code]

mingjian987 2007-12-5 19:14

呵呵..楼主没有看9楼伤心的鱼的回复吗?他已经给出答案了....
管理员可以过来结业封帖了..呵呵. [s:265]

月亮 2007-12-5 19:28

[quote]引用第12楼mingjian987于2007-12-05 19:14发表的 :
呵呵..楼主没有看9楼伤心的鱼的回复吗?他已经给出答案了....
管理员可以过来结业封帖了..呵呵. [s:265][/quote]

这样啊,我还在更改的时候你就发了
你要结也对
不过我没明白
没关系
算了,结吧
我单独在去找找资料看看,
现在脑子乱,反应也迟钝

runkeji 2007-12-5 19:49

搞的什么呀,怎么一次性不能插入多条数据呢?没有见过这样的数据库呀。
那么你数据在备份和恢复的时候,不是也是一条一条的插入进去的吗? 执行了多条吗。

黄瓜 2007-12-5 20:43

excel做了之后,直接导过去不就行了!
为什么就要一行行的写呢!

hack520 2007-12-6 00:21

直接用BULK INSERT 插就行了
把那些猪内容保存为excel...

silenceshell 2007-12-6 13:21

[s:265]
================================
/*
use student
create table s
(
  sno char(10) not null primary key,
  sn varchar(20) not null ,
  sex char(8) not null check (sex in (&#39;boy&#39;,&#39;girl&#39;)),
  age int not null check (age>0),
  dept varchar(30),
  constraint sn_u unique(sn)
)
================表
s1  李涛  boy  19  信息
s2  王林  girl  18  计算机
s3  陈高  girl  21  自动化
s4  张杰  boy  17  自动化
s5  吴小莉  girl  19  信息
s6  徐敏敏  girl  20  计算机

*/
insert into s (sno,sn,sex,age,dept)
select &#39;s1&#39;,&#39;李涛&#39;,&#39;boy&#39;,19,&#39;信息&#39; union
select &#39;s2&#39;,&#39;王林&#39;,&#39;girl&#39;,18,&#39;计算机&#39; union
select &#39;s3&#39;,&#39;陈高&#39;,&#39;girl&#39;,18,&#39;自动化&#39; union
select &#39;s4&#39;,&#39;张杰&#39;,&#39;boy&#39;,17,&#39;自动化&#39; union
select &#39;s5&#39;,&#39;吴小莉&#39;,&#39;girl&#39;,19,&#39;信息&#39; union
select &#39;s6&#39;,&#39;徐敏敏&#39;,&#39;girl&#39;,20,&#39;计算机&#39;

===================================

这是查询分析器的执行查询语句

下面是结果:

(所影响的行数为 6 行)


多句查询,楼主出现数据截断是因为表结构不合理,插入数据超过了数据库设定的数据长度
就会产生8125错误!

没有什么难的,关键是动手,自己也挺懒的!

Mail: [email]hidehai@yeah.net[/email]

[s:233]

silenceshell 2007-12-6 13:22

我一开始也有那个错误

然后修改了建表的语句..

OK!

月亮 2007-12-6 19:29

按照鱼的第一条方法,解决!
可以结贴了!
剩下那个方法我在想

谢谢伤心的鱼!!!!!

月亮 2007-12-6 19:36

在一个师傅的帮助下
记录下text里面的内容吧:
我竟然老是在text文本文件里面写错,以后有小鸟看到可以用我这个:
[quote]
s1;李涛;B;19;信息
s2;王林;G;18;计算机
s3;陈高;G;18;自动化
s4;张杰;B;17;自动化
s5;吴小莉;G;19;信息
s6;徐敏敏;G;20;计算机
[/quote]

最后谢谢各位大大了!
……
结贴吧……

页: [1]
© 1999-2008 EvilOctal Security Team