本帖最后由 zearling1 于 2013-01-29 17:50:40 编辑

解决方案 »

  1.   

    如果你给入的变量
    @strExcelPath
    @strExcelSheetName
    @strWhere
    有错误,select没有执行,那么就会出现这个错误。点击数据库右键,任务,数据导入就能倒入excel了,不用这么麻烦。
    但是最好在导入的时候把excel存成csv文件导入,不然时间列经常会被转成int存储。
      

  2.   

    我是要写在程序里的方法不然我也不用那么麻烦 直接sql导了
      

  3.   

    那你就看看
    @strExcelPath
    @strExcelSheetName
    @strWhere
    是不是都正确,还有就是 Extended properties=Excel 5.0是否正确,我google了一下,通常都是使用8.0就像我之前说的,
    SET @strSql = 'SELECT ' + @strExcelFiled + ' INTO ##Temp FROM  OpenDataSource('+ @strExcelPath +')'+ @strExcelSheetName +'$ '+@strWhere 
    --PRINT(@strSql) 
    EXEC(@strSql)
    这里你print一下strsql 看看能不能执行,应该是没有数据读取,所以后面就出错了。
      

  4.   

    期待答案,能否测试成功之后告诉一下我通过的代码啊?我都好需要这样的存储过程,现在都是用C#的DATAGIRDVIEW控件导入到电子表格来导出数据,但电子表格导入该控件我还不太懂,最希望用存储过程来导入实际表内之后显示出来 
      

  5.   

    USE [bcsr]
    GO
    /****** Object:  StoredProcedure [dbo].[spExcelOutIn]    Script Date: 01/30/2013 15:30:52 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    /*
    --下面两句在创建存储过程时必须先执行,否则不能创建本存储过程,或者调用出错
    SET ANSI_WARNINGS ON--返回警告
    GO
    SET ANSI_NULLS ON-- 指定在对空值使用等于   (=)   和不等于   (<>)   比较运算符时,这些运算符的   SQL-92   遵从行为。
    GO
    --将Excel数据导入到sql数据库
    --版权 : 启程 letwego.cn
    --调用实例
    EXEC spExcelOutIn 
    @strOptions = 'In',
    @strWhere = 'WHERE 房号>0',--导入/导出查询条件(包括Where 关键字)
    @strExcelPath = 'd:\test.xls',--Excel的绝对路径
    @strExcelSheetName = 'Sheet2',--Excel里要导入的工作表名称 如Sheet2,注意,后面不要加上$
    @strExcelFiled = '单元编号,单元名称,房号,建筑面积,楼层,楼层名称,楼阁编号,业主',--Excel工作表的字段@strSqlTableName = 'TExcelOutIn',--Sql数据库导入表名
    @strSqlFiled = '单元编号,单元名称,房号编号,建筑面积,楼层,楼层名称,楼阁编号,业主编号'--Sql表的字段
    */
    ALTER PROCEDURE [dbo].[spExcelOutIn]@strOptions varchar(200) = NULL,
    @strWhere nvarchar(4000) = NULL,--导入/导出查询条件(包括Where 关键字)@strExcelPath nvarchar(1000) = NULL,--Excel的绝对路径
    @strExcelSheetName nvarchar(50) = NULL,--Excel里要导入的工作表名称 如Sheet2,注意,后面不要加上$
    @strExcelFiled nvarchar(1000) = NULL,--Excel工作表的字段@strSqlTableName nvarchar(100) = NULL,--Sql数据库导入/导出表名
    @strSqlFiled nvarchar(1000) = NULL--Sql表的字段ASDECLARE @strSql nvarchar(4000)
    DECLARE @count int
    IF OBJECT_ID('tempdb..##Temp') IS NOT NULL DROP TABLE ##Temp
    /* 导入 */
    IF @strOptions='In' AND NOT @strExcelPath IS NULL BEGINSET @strExcelPath = '''Microsoft.Jet.OLEDB.4.0'',''Data Source="' + @strExcelPath + '";User ID=Admin;Password=;Extended properties=Excel 8.0'''--将数据存放到临时表(一)
    SET @strSql =
    'SELECT ' + @strExcelFiled +
    ' INTO ##Temp
    FROM 
    OpenDataSource('+ @strExcelPath +')...'+ @strExcelSheetName +'$ '
    +@strWhere--PRINT(@strSql)
    EXEC(@strSql)--将数据从临时表导入到sql数据库表(二,分两步可以做更多的处理)
    SET @strSql = 'INSERT INTO ' + @strSqlTableName + '('+ @strSqlFiled +') SELECT * FROM ##Temp'
    PRINT(@strSql)
    EXEC(@strSql)--SELECT * FROM ##Temp
    DROP TABLE ##TempEND/* 导出 */
    IF @strOptions='Out' AND NOT @strExcelPath IS NULL BEGINSET @strExcelPath = ''
    --导成类似(不是真正的Excel,是文本格式)Excel的文件,这里是固定的,真正用时需要修改相关参数
    --EXEC master..xp_cmdshell 'bcp "SELECT * FROM wy_福州分公司.dbo.TExcelOutIn" queryout C:\test.xls -c -S"(local)" -U"sa" -P"123"'
    END
    declare @batchname intSET @batchname=(select MAX(id) from riskbatch)IF @strSqlTableName = 'accountinfo'
    BEGIN
    SET @count=(SELECT COUNT(*) FROM accountinfo WHERE batchname is null)
    UPDATE riskbatch SET count=@count WHERE id=@batchname
    update accountinfo set batchname=@batchname where batchname is null
    END
    IF @strSqlTableName = 'tb_transaction'
    update tb_transaction set batchname=@batchname where batchname is null这个是通用的方法 然后我当时查询的时候通过这种EXEC spExcelOutIn 
    @strOptions = 'In',
    @strWhere = '',--导入/导出查询条件(包括Where 关键字)
    @strExcelPath = 'd:/CN20130110181706-testing.xls',--Excel的绝对路径
    @strExcelSheetName = '渣打银行',--Excel里要导入的工作表名称 如Sheet2,注意,后面不要加上$
    @strExcelFiled ='"ACCOUNTNODeal No","Customer Chinese Name","Customer English Name","Currency","Balance","Bizcode","Email","Normal","Balance Date","RELATIONSHIPNO","Master No","Account Opening Branch Chinese Name","Branch Code","ARM Code","Product Code","Product Description","Segment Code","EMT","Account Status","Account Open Date"',--Excel工作表的字段@strSqlTableName = 'accountinfo',--Sql数据库导入表名
    @strSqlFiled = 'accountno,chinesename,englishname,currency,balance,bizcode,isemail,isnormal,balancedate,relationshipno,masterno,accountopenbranch,branchcode,armcode,productcode,productdesc,segmentcode,emt,accountstatus,accountOpenDate'--Sql表的字段搞定了 总结excel中第一行的对应的sql表的列名 但是 他的格式中不能有符号 且如果有控制之类的要用""转义符来转义