[讨论]数据库表里大量数据一次性写入问题
议题作者:月亮信息来源:邪恶八进制信息安全团队([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]
…………
可一行一行的写入太累了,所以请问各位大大,有没有办法直接一下子将那个表里的数据全部写入?
我不想一行一行的写入
想把上面的那个表一次性全部写进去能做到吗? [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 openrowset
你是说要用一段代码实现对吗?
你能那那段代码写出来看下吗?
最好能用C写
呵呵,
这是我的一个小小的求助!我现在还在踉踉跄跄的学,所以这么简单的sql问题都不能解决
……
如果能帮助我,就先谢谢了! [s:265]
那天我可问过你咯,如果你TXT里是按照固定格式写的数据,我帮你写个程序生成SQL语句,然后你到查询分析器里执行就可以了,至于固定格式么,我用最简单的方法说:
假设我写的程序为:
每次读取一行;
每行由四个空格分开,分成5个段落,5个段落的顺序分别是第一段落学号,第二段落名字。。。。
PS:明白?如果不明白就诚实的交代,么要装啊,要装去下面的“装吧” [s:66]
好啊,那你写完的代码用球球发我吧!什么语言写都成,只要能用。嘿嘿
sp:我木装啊! [s:50]
像这样的问题解决用vb最方便吗? 用多句插入可以吧,为什么是只能一句呢?
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]引用第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语句应该是无法实现多语句插入的
必须借助其他语言
否则我也不会来问这个问题啦
嘿嘿
不过谢谢你的指点 写个存储过程就可以了。
insert into xx (field1,field2) select x from table2;
select into 也可以批量. [quote]引用第6楼月亮于2007-12-03 20:22发表的 :
你实验一下就发现了
只要字符没有超出限制
单独用sql语句应该是无法实现多语句插入的
.......[/quote]
你这个问题没有其他限制吧?
我没有去试验,我曾经做过类似的啊,你去试验了吗? 哎,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,随便搜搜就有解决办法了: | 补充一下,字段那里可以自己设置,导入的时候先把除了字段内容的其他东西删除掉.比如你TXT开头的字段名
留下纯内容,或者在导入数据那里把屏蔽第一行选择上,
本地只有SQL2005.说得不详细,自己去看一下就懂了 [quote]引用第9楼伤心的鱼于2007-12-04 23:26发表的 :
首先如果你在企业管理器里操作的话,你在你要导入数据的数据库上单击右键-任务-导入数据
数据源那里选择文本文件,分隔符选择空格,NEXT,NEXT,NEXT。。。OK.......[/quote]
txt文本文件里面的是不是
[code]
's1','李涛','B','19','信息',
's2','王林','G','18','计算机',
's3','陈高','G21','自动化',
's4','张杰','B17','自动化',
's5','吴小莉','G19','信息',
's6','徐敏敏','G20','计算机',
[/code] 呵呵..楼主没有看9楼伤心的鱼的回复吗?他已经给出答案了....
管理员可以过来结业封帖了..呵呵. [s:265] [quote]引用第12楼mingjian987于2007-12-05 19:14发表的 :
呵呵..楼主没有看9楼伤心的鱼的回复吗?他已经给出答案了....
管理员可以过来结业封帖了..呵呵. [s:265][/quote]
这样啊,我还在更改的时候你就发了
你要结也对
不过我没明白
没关系
算了,结吧
我单独在去找找资料看看,
现在脑子乱,反应也迟钝 搞的什么呀,怎么一次性不能插入多条数据呢?没有见过这样的数据库呀。
那么你数据在备份和恢复的时候,不是也是一条一条的插入进去的吗? 执行了多条吗。 excel做了之后,直接导过去不就行了!
为什么就要一行行的写呢! 直接用BULK INSERT 插就行了
把那些猪内容保存为excel... [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 ('boy','girl')),
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 's1','李涛','boy',19,'信息' union
select 's2','王林','girl',18,'计算机' union
select 's3','陈高','girl',18,'自动化' union
select 's4','张杰','boy',17,'自动化' union
select 's5','吴小莉','girl',19,'信息' union
select 's6','徐敏敏','girl',20,'计算机'
===================================
这是查询分析器的执行查询语句
下面是结果:
(所影响的行数为 6 行)
多句查询,楼主出现数据截断是因为表结构不合理,插入数据超过了数据库设定的数据长度
就会产生8125错误!
没有什么难的,关键是动手,自己也挺懒的!
Mail: [email]hidehai@yeah.net[/email]
[s:233] 我一开始也有那个错误
然后修改了建表的语句..
OK! 按照鱼的第一条方法,解决!
可以结贴了!
剩下那个方法我在想
谢谢伤心的鱼!!!!! 在一个师傅的帮助下
记录下text里面的内容吧:
我竟然老是在text文本文件里面写错,以后有小鸟看到可以用我这个:
[quote]
s1;李涛;B;19;信息
s2;王林;G;18;计算机
s3;陈高;G;18;自动化
s4;张杰;B;17;自动化
s5;吴小莉;G;19;信息
s6;徐敏敏;G;20;计算机
[/quote]
最后谢谢各位大大了!
……
结贴吧……
页:
[1]