********************* 導(dǎo)入 xml 文件 [Page]
DECLARE @idoc int 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 /**********************Excel導(dǎo)到Txt****************************************/ 想用 select * into opendatasource(...) from opendatasource(...) 實現(xiàn)將一個Excel文件內(nèi)容導(dǎo)入到一個文本文件 假設(shè)Excel中有兩列,第一列為姓名,第二列為很行賬號(16位) 且銀行賬號導(dǎo)出到文本文件后分兩部分,前8位和后8位分開。 鄒健: 如果要用你上面的語句插入的話,文本文件必須存在,而且有一行:姓名,銀行賬號1,銀行賬號2 然后就可以用下面的語句進行插入 注意文件名和目錄根據(jù)你的實際情況進行修改. 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表內(nèi)容導(dǎo)入到一個全局臨時表 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從全局臨時表導(dǎo)出到文本文件 set @sql='bcp "'+@tbname+'" out "c:\aa.txt" /S"(local)" /P"" /c' exec master..xp_cmdshell @sql --刪除臨時表 exec('drop table '+@tbname) /********************導(dǎo)整個數(shù)據(jù)庫*********************************************/ [Page] 用bcp實現(xiàn)的存儲過程 /* 實現(xiàn)數(shù)據(jù)導(dǎo)入/導(dǎo)出的存儲過程 根據(jù)不同的參數(shù),可以實現(xiàn)導(dǎo)入/導(dǎo)出整個數(shù)據(jù)庫/單個表 調(diào)用示例: --導(dǎo)出調(diào)用示例 ----導(dǎo)出單個表 exec file2table 'zj','','','xzkh_sa..地區(qū)資料','c:\zj.txt',1 ----導(dǎo)出整個數(shù)據(jù)庫 exec file2table 'zj','','','xzkh_sa','C:\docman',1 --導(dǎo)入調(diào)用示例 ----導(dǎo)入單個表 exec file2table 'zj','','','xzkh_sa..地區(qū)資料','c:\zj.txt',0 ----導(dǎo)入整個數(shù)據(jù)庫 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) --服務(wù)器名 ,@username varchar(200) --用戶名,如果用NT驗證方式,則為空'' ,@password varchar(200) --密碼 ,@tbname varchar(500) --數(shù)據(jù)庫.dbo.表名,如果不指定:.dbo.表名,則導(dǎo)出數(shù)據(jù)庫的所有用戶表 ,@filename varchar(1000) --導(dǎo)入/導(dǎo)出路徑/文件名,如果@tbname參數(shù)指明是導(dǎo)出整個數(shù)據(jù)庫,則這個參數(shù)是文件存放路徑,文件名自動用表名.txt ,@isout bit --1為導(dǎo)出,0為導(dǎo)入 as declare @sql varchar(8000) if @tbname like '%.%.%' --如果指定了表名,則直接導(dǎo)出單個表 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 --導(dǎo)出整個數(shù)據(jù)庫,定義游標,取出所有的用戶表 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導(dǎo)出,是沒有字段名的. 用openrowset導(dǎo)出,需要事先建好表. 用openrowset導(dǎo)入,除ACCESS及EXCEL外,均不支持非本機數(shù)據(jù)導(dǎo)入 |
|