免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5384 | 回复: 3
打印 上一主题 下一主题

SQL导入EXCEL ,出现点错误,请帮忙解决.Thanks [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-07-14 13:20 |只看该作者 |倒序浏览
-- 創建一個“臨時”的鏈結伺服器到剛才的檔中,以用於“導出”資料
        EXEC sp_addlinkedserver \'ExcelSource\',
        \'Jet 4.0\',
        \'Microsoft.Jet.OLEDB.4.0\',
        @fileName,
        NULL,
        \'Excel 5.0\'
        -- 構建一個T-SQL 語句,用於實際導出查詢結果
        -- 到目標鏈結伺服器上的表中
        set @tsqlStmt = \'Insert ExcelSource...[ExcelTable$] \' +  \' ( \' + @colList + \' ) \'+ @query
        
        print @tsqlStmt
        -- 執行動態的 TSQL語句
        exec (@tsqlStmt)


错误信息:
OLE DB Provider \'Microsoft.Jet.OLEDB.4.0\' 報告了錯誤。驗證失敗。
[OLE/DB provider returned message: 無法啟動您的應用程式。工作群組的資料檔案不見了或被另一個使用者以獨佔方式開啟。]

请问我怎么解决?

论坛徽章:
0
2 [报告]
发表于 2005-07-14 13:27 |只看该作者
SQL导入EXCEL 都能这么复杂,我没看明白...用导入导出工具不是很方便的么?

论坛徽章:
0
3 [报告]
发表于 2005-07-14 13:50 |只看该作者
因为我不是单独导一个表,是通过SQL,几个表资料表的内容。本来是可以用DTS.可是EXCEL在原本记录下添加,而不是删除后再加入。而且我是每天都要导出

论坛徽章:
0
4 [报告]
发表于 2005-07-14 13:53 |只看该作者
我也是从网上看到。原始CODE
SQL Server有一些工具可用来导出和导入数据。这些简单的工具,例如T-SQL的BULK INSERT语句,或者是BCP工具,都可以将数据以纯文本文件的形式传输。如果需要处理任何一种其它类型的档的导入导出,则我们必须使用DTS设计器或者DTS向导构建一个DTS包。最终生成的DTS包是一个我们必须测试、维护和操作的独立的对象。而传输数据的工作则变得更加复杂,即使我们只是想要将一个简单的Excel文件传输到文件系统中。
  这里,我建议使用一个简单,但是很有用的T-SQL 存储程序,它可以通过使用链接服务器(linked server)技术将资料导出到Excel 中。
  为了实现导出,你必须首先创建一个空的有固定名字的Excel档,并将其放置在服务器上。我把它命名为Empty.xls,并放置在c:\\temp的目录下。这个档不会被删除,并且在装入数据之前,作为目标Excel文件的模板使用。
  Empty.xls档被构建的时候,只含有一个工作页,名为ExcelTable,其中的第一行(仅有的一行)包含如下字母: A,B,C,...Z。这些字母可作为Excel表的列名称。这意味着在一个查询中,我们可以导出26个列。(给定的存储程序代码可被修改,以支持结果集中含有更多的列的情况。只需要在Excel范本中简单地书写F1, F2 ,F3...,然后更改程序中相应列的列表即可反映出变化了。)
  sp_write2Excel是一个T-SQL存储过程,它获取目标Excel文件的名字和路径,结果集中列的数量,以及T-SQL查询。在查询中应该使用转换函数将所有的非字符串数据导入列中,因为最终的Excel单元中数据实际上都是字符串格式的。
  这个过程将empty.xls模板文件拷贝到新的目标Excel文件中。然后它再构建一个链接服务器到刚才的文件中,并使用动态的T-SQL来构建这个Excel档,并且使用插入/选择语句来将数据写入其中。
以下是程序代码:
Create proc sp_write2Excel (@fileName varchar(100),
                                   @NumOfColumns tinyint,
                                   @query    varchar(200))
as
begin
        declare @dosStmt  varchar(200)
        declare @tsqlStmt varchar(500)
        declare @colList  varchar(200)
        declare @charInd  tinyint
        
        set nocount on

        -- 构建列的列表 A,B,C ...
        -- 直到达到列的数量.

        set @charInd=0
        set @colList = \'A\'
        while @charInd < @NumOfColumns - 1
        begin
          set @charInd = @charInd + 1
          set @colList = @colList + \',\' + char(65 + @charInd)
        end
        -- 创建一个空的Excel 文件作为目标文件,通过拷贝模板Excel 文件来命名
        set @dosStmt = \' copy c:\\temp\\empty.xls \' + @fileName
        exec master..xp_cmdshell @dosStmt

        -- 创建一个“临时”的链接服务器到刚才的文件中,以用于“导出”资料
        EXEC sp_addlinkedserver \'ExcelSource\',
        \'Jet 4.0\',
        \'Microsoft.Jet.OLEDB.4.0\',
        @fileName,
        NULL,
        \'Excel 5.0\'
        -- 构建一个T-SQL 语句,用于实际导出查询结果
        -- 到目标链接服务器上的表中
        set @tsqlStmt = \'Insert ExcelSource...[ExcelTable$] \' +  \' ( \' + @colList + \' ) \'+ @query
        
        print @tsqlStmt
        -- 执行动态的 TSQL语句
        exec (@tsqlStmt)
        -- 删除链接服务器
        EXEC sp_dropserver \'ExcelSource\'
        set nocount off
end
GO
程序使用实例:
Use master
go
exec sp_write2Excel
           --目标excel文件
           \'c:\\temp\\NorthProducts.xls\' ,            
           -- 结果中列的数量         
           3,                                                  
  
           -- 将要导出结果的查询   
           \'select convert(varchar(10),ProductId),  
            ProductName,
            Convert (varchar(20),UnitPrice) from Northwind..Products\'
  结论,这个程序可作为一个通用的工具将数据导出到Excel工作页中,而BCP工具则只能将数据导出到文本文件中。
  我们可以使用这个程序来代替DTS包设计器,以及DTS向导,每当需要调用这样的动作的时候,都可以用它将数据导出到excel 文件中。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP