怎样把一个xml数据文件导入sqlserver 忘了说明了,想用DTS,程序我用.net已经实现了,就是效率太慢. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在前台处理,一般语言都有处理XML文档的控件,很方便的就可以导入了. DECLARE @idoc intDECLARE @doc varchar(1000)--sample XML documentSET @doc ='<root> <Customer cid= "C1" name="Janine" city="Issaquah"> <Order oid="O1" date="1/20/1996" amount="3.5" /> <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied </Order> </Customer> <Customer cid="C2" name="Ursula" city="Oelde" > <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue white red"> <Urgency>Important</Urgency> Happy Customer. </Order> <Order oid="O4" date="1/20/1996" amount="10000"/> </Customer></root>'-- Create an internal representation of the XML document.EXEC sp_xml_preparedocument @idoc OUTPUT, @doc-- Execute a SELECT statement using OPENXML rowset provider.SELECT *FROM OPENXML (@idoc, '/root/Customer/Order', 1) WITH (oid char(5), amount float, comment ntext 'text()')EXEC sp_xml_removedocument @idoc??????? 如果内容不多,可以用下面的方法DECLARE @idoc int,@doc varchar(8000)--从文件中读出XML内容到临时表create table #tb (doc varchar(8000))bulk insert #tb from 'c:\a.xml'--将读取到的数据保存到变量中set @doc=''select @doc=@doc+doc from #tb--删除临时表drop table #tb/*下面是从文件中读取的内容SET @doc ='<?xml version=''1.0'' encoding="gb2312"?><进攻战斗命令><发文字号>19XX司作字第X号</发文字号><密级>X密</密级><发文单位标识> <中国人民>中国人民</中国人民> <解放军>解放军</解放军> <标识>摩托化步兵第X师(命令)</标识></发文单位标识><标题>XX地区进攻战斗</标题><地图和年版>地图1:30万 19xx年版</地图和年版><主送单位>各团,集团军坦克师第1团、炮兵旅</主送单位><正文> <段落>一,敌摩托化步兵第*师孤军冒进,进攻受阻,被迫于*月*日*时在**地区转入防御。(具体部署见敌情通报)。</段落> <段落>二,集团军首长决心集中主要兵力兵器在**(**,**)至**(**,**)地段实施主要突破,向***(**,**)、**(**,**)、**(**,**)方向实施主要突击。首先歼灭**(**,**)、**(**,**)地域之敌,尔后歼灭**(**,**)、**(**,**)地域之敌,再向**(**,**)、**(**,**)方向发展进攻。</段落> <段落>三,师基本指挥所、预备指挥所、后方指挥所于*日*时*分前分别在**(**,**)、**(**,**)、**(**,**)开设完毕。</段落></正文><附件>附:摩托化步兵第X师行军计划(略)</附件><署名>师 长 : X X X </署名> <署名>政治委员: X X X </署名><署名1>参 谋 长: X X X</署名1><成文时间>19XX年X月X日X时X分于XXX</成文时间><承办单位>承办单位:作训科</承办单位></进攻战斗命令>'--*/EXEC sp_xml_preparedocument @idoc OUTPUT, @doc--第一层SELECT * FROM OPENXML (@idoc, '/进攻战斗命令',2)WITH ( 发文字号 varchar(50), 密级 varchar(50), 标题 varchar(500), 地图和年版 varchar(500), 主送单位 varchar(50), 附件 varchar(500), 署名 varchar(50), 署名1 varchar(50), 成文时间 varchar(24), 承办单位 varchar(50) )--第二层--发文单位标识SELECT * FROM OPENXML (@idoc, '/进攻战斗命令/发文单位标识',2)WITH ( 发文字号 varchar(50) '../发文字号', 中国人民 varchar(100), 解放军 varchar(100), 标识 varchar(50) )--第二层--正文SELECT * FROM OPENXML (@idoc, '/进攻战斗命令/正文/段落',2)WITH ( 发文字号 varchar(50) '/进攻战斗命令/发文字号', 段落 varchar(8000) '.' )EXEC sp_xml_removedocument @idoc 如果记录太长的话,只能在前台处理啦,因为SQL不支持定义text类型的变量只能在存储过程中定义text类型的参数,所以需要前台传入数据,写存储过程来处理.--对于上面的例子,创建一个存储过程来处理create proc p_xml @doc textasdeclare @idoc intEXEC sp_xml_preparedocument @idoc OUTPUT, @docSELECT * FROM OPENXML (@idoc, '/进攻战斗命令',2)WITH ( 发文字号 varchar(50), 密级 varchar(50), 标题 varchar(500), 地图和年版 varchar(500), 主送单位 varchar(50), 附件 varchar(500), 署名 varchar(50), 署名1 varchar(50), 成文时间 varchar(24), 承办单位 varchar(50) )...其他处理go--然后在前参调用这个存储过程来处理就行了. public function Saved(xmldoc) dim lab_id, lab_num, lab_code, lab_name dim nodeItem dim db set db=server.CreateObject("adodb.command") db.ActiveConnection = private_connstr db.CommandType=4 db.CommandText="Save_p_clnc_lab" set clnc_lab_doc = xmldoc set nodes = clnc_lab_doc.selectNodes("//p_lab") for i=0 to nodes.length-1 set nodeItem=nodes.item(i) lab_id = nodeItem.getAttribute("lab_id") lab_num = nodeItem.getAttribute("lab_num") lab_code = nodeItem.getAttribute("lab_code") lab_name = nodeItem.getAttribute("lab_name") db.Parameters.append db.CreateParamete("@returnvalue",adInteger,adParamReturnValue,4) db.Parameters.append db.CreateParameter("@lab_id",adInteger,adParamInput,4,lab_id) db.Parameters.append db.CreateParameter("@lab_num",adVarChar,adParamInput,8,lab_num) db.Parameters.append db.CreateParameter("@lab_code",adVarChar,adParamInput,8,lab_code) db.Execute next本例所用xml结构如下:<root> <p_lab lab_id="" lab_num="" lab_code="" lab_name="" /></root>"Save_p_clnc_lab"为存储过程 如果xml结构为多层,代码的循环也相应为多层 DECLARE @idoc int,@doc varchar(8000)SET @doc ='<?xml version="1.0" encoding="GB2312"?><电子病历> <病案 num="1"> <姓名>梁景</姓名> <性别>女</性别> <出生日期>1985-7-12</出生日期> <婚姻>已婚</婚姻> <职业>工人</职业> </病案> <病案 num="2"> <姓名>张路</姓名> <性别>女</性别> <出生日期>1985-7-12</出生日期> <婚姻>已婚</婚姻> <职业>工人</职业> </病案> <病案 num="3"> <姓名>何江</姓名> <性别>男</性别> <出生日期>1985-7-12</出生日期> <婚姻>已婚</婚姻> <职业>工人</职业> </病案></电子病历>'EXEC sp_xml_preparedocument @idoc OUTPUT, @docSELECT * FROM OPENXML (@idoc, '/电子病历/病案',2) WITH (姓名 varchar(20) ,性别 varchar(2) ,出生日期 datetime ,婚姻 varchar(10) ,职业 varchar(50) ) sql如何删除两个表中的重复记录?求助大家 因为该列没有包含在聚合函数或 GROUP BY 子句中,强加group by数据不对 子查询问题 请教 !!!!!!!!!!!!!问题如图 SQLServer启动一段时间后操作奇慢无比,怎么办啊? 求两个表中查询无记录的方法(在线) 求助,关于SQL并发的问题。 数据库怪异问题...求救 急…如何知道数据库服务器的MS SQL 连接参数? 一简单查询,请各位帮忙! 救命啊,已经连续数日如此了~~ insert into 里可以套多个select xxx from xx... 这样的语句吗,有完整的例子吗
DECLARE @doc varchar(1000)
--sample XML document
SET @doc ='
<root>
<Customer cid= "C1" name="Janine" city="Issaquah">
<Order oid="O1" date="1/20/1996" amount="3.5" />
<Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied
</Order>
</Customer>
<Customer cid="C2" name="Ursula" city="Oelde" >
<Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue
white red">
<Urgency>Important</Urgency>
Happy Customer.
</Order>
<Order oid="O4" date="1/20/1996" amount="10000"/>
</Customer>
</root>
'
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/root/Customer/Order', 1)
WITH (oid char(5),
amount float,
comment ntext 'text()')
EXEC sp_xml_removedocument @idoc???????
DECLARE @idoc int,@doc varchar(8000)--从文件中读出XML内容到临时表
create table #tb (doc varchar(8000))
bulk insert #tb from 'c:\a.xml'--将读取到的数据保存到变量中
set @doc=''
select @doc=@doc+doc from #tb--删除临时表
drop table #tb/*下面是从文件中读取的内容
SET @doc ='
<?xml version=''1.0'' encoding="gb2312"?>
<进攻战斗命令>
<发文字号>19XX司作字第X号</发文字号>
<密级>X密</密级>
<发文单位标识>
<中国人民>中国人民</中国人民>
<解放军>解放军</解放军>
<标识>摩托化步兵第X师(命令)</标识>
</发文单位标识>
<标题>XX地区进攻战斗</标题>
<地图和年版>地图1:30万 19xx年版</地图和年版>
<主送单位>各团,集团军坦克师第1团、炮兵旅</主送单位>
<正文>
<段落>一,敌摩托化步兵第*师孤军冒进,进攻受阻,被迫于*月*日*时在**地区转入防御。(具体部署见敌情通报)。</段落>
<段落>二,集团军首长决心集中主要兵力兵器在**(**,**)至**(**,**)地段实施主要突破,向***(**,**)、**(**,**)、**(**,**)方向实施主要突击。首先歼灭**(**,**)、**(**,**)地域之敌,尔后歼灭**(**,**)、**(**,**)地域之敌,再向**(**,**)、**(**,**)方向发展进攻。</段落>
<段落>三,师基本指挥所、预备指挥所、后方指挥所于*日*时*分前分别在**(**,**)、**(**,**)、**(**,**)开设完毕。</段落>
</正文>
<附件>附:摩托化步兵第X师行军计划(略)</附件>
<署名>师 长 : X X X </署名>
<署名>政治委员: X X X </署名>
<署名1>参 谋 长: X X X</署名1>
<成文时间>19XX年X月X日X时X分于XXX</成文时间>
<承办单位>承办单位:作训科</承办单位>
</进攻战斗命令>
'
--*/
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc--第一层
SELECT * FROM OPENXML (@idoc, '/进攻战斗命令',2)
WITH (
发文字号 varchar(50),
密级 varchar(50),
标题 varchar(500),
地图和年版 varchar(500),
主送单位 varchar(50),
附件 varchar(500),
署名 varchar(50),
署名1 varchar(50),
成文时间 varchar(24),
承办单位 varchar(50)
)--第二层--发文单位标识
SELECT * FROM OPENXML (@idoc, '/进攻战斗命令/发文单位标识',2)
WITH (
发文字号 varchar(50) '../发文字号',
中国人民 varchar(100),
解放军 varchar(100),
标识 varchar(50)
)--第二层--正文
SELECT * FROM OPENXML (@idoc, '/进攻战斗命令/正文/段落',2)
WITH (
发文字号 varchar(50) '/进攻战斗命令/发文字号',
段落 varchar(8000) '.'
)EXEC sp_xml_removedocument @idoc
只能在存储过程中定义text类型的参数,所以需要前台传入数据,写存储过程来处理.--对于上面的例子,创建一个存储过程来处理
create proc p_xml @doc text
as
declare @idoc int
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
SELECT * FROM OPENXML (@idoc, '/进攻战斗命令',2)
WITH (
发文字号 varchar(50),
密级 varchar(50),
标题 varchar(500),
地图和年版 varchar(500),
主送单位 varchar(50),
附件 varchar(500),
署名 varchar(50),
署名1 varchar(50),
成文时间 varchar(24),
承办单位 varchar(50)
)
...其他处理
go
--然后在前参调用这个存储过程来处理就行了.
public function Saved(xmldoc)
dim lab_id, lab_num, lab_code, lab_name
dim nodeItem
dim db set db=server.CreateObject("adodb.command")
db.ActiveConnection = private_connstr
db.CommandType=4
db.CommandText="Save_p_clnc_lab"
set clnc_lab_doc = xmldoc
set nodes = clnc_lab_doc.selectNodes("//p_lab") for i=0 to nodes.length-1
set nodeItem=nodes.item(i)
lab_id = nodeItem.getAttribute("lab_id")
lab_num = nodeItem.getAttribute("lab_num")
lab_code = nodeItem.getAttribute("lab_code")
lab_name = nodeItem.getAttribute("lab_name")
db.Parameters.append db.CreateParamete("@returnvalue",adInteger,adParamReturnValue,4)
db.Parameters.append db.CreateParameter("@lab_id",adInteger,adParamInput,4,lab_id)
db.Parameters.append db.CreateParameter("@lab_num",adVarChar,adParamInput,8,lab_num)
db.Parameters.append db.CreateParameter("@lab_code",adVarChar,adParamInput,8,lab_code)
db.Execute
next本例所用xml结构如下:
<root>
<p_lab lab_id="" lab_num="" lab_code="" lab_name="" />
</root>"Save_p_clnc_lab"为存储过程
<?xml version="1.0" encoding="GB2312"?>
<电子病历>
<病案 num="1">
<姓名>梁景</姓名>
<性别>女</性别>
<出生日期>1985-7-12</出生日期>
<婚姻>已婚</婚姻>
<职业>工人</职业>
</病案>
<病案 num="2">
<姓名>张路</姓名>
<性别>女</性别>
<出生日期>1985-7-12</出生日期>
<婚姻>已婚</婚姻>
<职业>工人</职业>
</病案>
<病案 num="3">
<姓名>何江</姓名>
<性别>男</性别>
<出生日期>1985-7-12</出生日期>
<婚姻>已婚</婚姻>
<职业>工人</职业>
</病案>
</电子病历>
'EXEC sp_xml_preparedocument @idoc OUTPUT, @docSELECT * FROM OPENXML (@idoc, '/电子病历/病案',2)
WITH (姓名 varchar(20)
,性别 varchar(2)
,出生日期 datetime
,婚姻 varchar(10)
,职业 varchar(50)
)