|
<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
???????
/**********************Excel导到Txt****************************************/
想用
Select * Into Opendatasource(...) From Opendatasource(...)
实现将一个Excel文件内容导入到一个文本文件
假设Excel中有两列,第一列为姓名,第二列为很行帐号(16位)
且银行帐号导出到文本文件后分两部分,前8位和后8位分开。
邹健:
如果要用你上面的语句插入的话,文本文件必须存在,而且有一行:姓名,银行账号1,银行账号2
然后就可以用下面的语句进行插入
注意文件名和目录根据你的实际情况进行修改.
Insert Into
Opendatasource('MICROSOFT.JET.OLEDB.4.0'
,'Text;HDR=Yes;DATABASE=C:\'
)...[Aa#Txt]
--,Aa#Txt)
--*/
Select 姓名,银行账号1=Left(银行账号,8),银行账号2=Right(银行账号,8)
From
Opendatasource('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;IMEX=2;DATABASE=C:\A.Xls'
--,Sheet1$)
)...[Sheet1$]
如果你想直接插入并生成文本文件,就要用Bcp
Declare @Sql Varchar(8000),@Tbname Varchar(50)
--首先将Excel表内容导入到一个全局临时表
Select @Tbname='[##Temp'+Cast(Newid() As Varchar(40))+']'
,@Sql='Select 姓名,银行账号1=Left(银行账号,8),银行账号2=Right(银行账号,8)
Into '+@Tbname+' From
Opendatasource(''MICROSOFT.JET.OLEDB.4.0''
,''Excel 5.0;HDR=YES;IMEX=2;DATABASE=C:\A.Xls''
)...[Sheet1$]'
Exec(@Sql)
--然后用Bcp从全局临时表导出到文本文件
Set @Sql='Bcp "'+@Tbname+'" Out "C:\Aa.Txt" /S"(Local)" /P"" /C'
Exec Master..Xp_cmdshell @Sql
--删除临时表
Exec('Drop Table '+@Tbname)
/********************导整个数据库*********************************************/
用Bcp实现的存储过程
/*
实现数据导入/导出的存储过程
根据不同的参数,可以实现导入/导出整个数据库/单个表
调用示例:
--导出调用示例
----导出单个表
Exec File2table 'Zj','','','Xzkh_sa..地区资料','C:\Zj.Txt',1
----导出整个数据库
Exec File2table 'Zj','','','Xzkh_sa','C:\Docman',1
--导入调用示例
----导入单个表
Exec File2table 'Zj','','','Xzkh_sa..地区资料','C:\Zj.Txt',0
----导入整个数据库
Exec File2table 'Zj','','','Xzkh_sa','C:\Docman',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) --密码
,@Tbname Varchar(500) --数据库.Dbo.表名,如果不指定:.Dbo.表名,则导出数据库的所有用户表
,@Filename Varchar(1000) --导入/导出路径/文件名,如果@Tbname参数指明是导出整个数据库,则这个参数是文件存放路径,文件名自动用表名.Txt
,@Isout Bit --1为导出,0为导入
As
Declare @Sql Varchar(8000)
If @Tbname Like '%.%.%' --如果指定了表名,则直接导出单个表
Begin
Set @Sql='Bcp '+@Tbname
+Case When @Isout=1 Then ' Out ' Else ' In ' End
+' "'+@Filename+'" /W'
+' /S '+@Servername
+Case When Isnull(@Username,'')='' Then '' Else ' /U '+@Username End
+' /P '+Isnull(@Password,'')
Exec Master..Xp_cmdshell @Sql
End
Else
Begin --导出整个数据库,定义游标,取出所有的用户表
Declare @M_tbname Varchar(250)
If Right(@Filename,1)<>'\' Set @Filename=@Filename+'\'
Set @M_tbname='Declare #Tb Cursor For Select Name From '+@Tbname+'..Sysobjects Where Xtype=''U'''
Exec(@M_tbname)
Open #Tb
Fetch Next From #Tb Into @M_tbname
While @@Fetch_status=0
Begin
Set @Sql='Bcp '+@Tbname+'..'+@M_tbname
+Case When @Isout=1 Then ' Out ' Else ' In ' End
+' "'+@Filename+@M_tbname+'.Txt " /W'
+' /S '+@Servername
+Case When Isnull(@Username,'')='' Then '' Else ' /U '+@Username End
+' /P '+Isnull(@Password,'')
Exec Master..Xp_cmdshell @Sql
Fetch Next From #Tb Into @M_tbname
End
Close #Tb
Deallocate #Tb
End
Go
/************* Oracle **************/
EXEC Sp_addlinkedserver 'OracleSvr',
'Oracle 7.3',
'MSDAORA',
'ORCLDB'
GO
Delete From Openquery(Mailser,'Select * From Yulin')
Select * From Openquery(Mailser,'Select * From Yulin')
Update Openquery(Mailser,'Select * From Yulin Where Id=15')Set Disorder=555,Catago=888
Insert Into Openquery(Mailser,'Select Disorder,Catago From Yulin')Values(333,777)
补充:
对于用Bcp导出,是没有字段名的.
用Openrowset导出,需要事先建好表.
用Openrowset导入,除ACCESS及EXCEL外,均不支持非本机数据导入
|
|