【问题标题】:Fetch into Excel sheet and insert into SQL Server 2008 database提取 Excel 工作表并插入 SQL Server 2008 数据库
【发布时间】:2014-09-13 09:52:04
【问题描述】:

我想将 Excel 工作表中的数据导入我的 SQL Server 2008 数据库。

我有一个包含不同列的 Excel 工作表:

Service tag | marque | Type | Serial
FGT3456     | DELL   | UC   | Optiplex 760

我的表具有相同的结构,但不是varchar 值,而是外键(ID)

示例(表格材料)

Service tag | marque| Type | Serial 
FGT3456     |   1   |  18  |  27

我想要做的是获取 Excel 表中的 marque 列,获取所有品牌值,将这些值与我的表中的值进行比较,获取所有它们的 ID,最后将 Id 插入我的表材料。

我试过这段代码,但它显示错误

关键字“SELECT”附近的语法不正确。
')' 附近的语法不正确。
对象名称“SQL”无效。

这是我的代码

ALTER PROCEDURE [dbo].[spx_Import]
   @SheetName varchar(20),
   @FilePath varchar(100),
   @HDR varchar(3),
   @TableName varchar(50)
AS
BEGIN
    DECLARE @SQL nvarchar(1000)
    DECLARE @SQL1 nvarchar(1000)
    DECLARE @SQL2 nvarchar(1000)

    SET @SQL = 'SELECT idMarque FROM MarqueMateriel WHERE marque = SELECT (marque) FROM OPENDATASOURCE'
    SET @SQL1 = 'INSERT INTO Material (Service tag) SELECT (service tag) FROM OPENDATASOURCE'
    SET @SQL2 = 'INSERT INTO Material (MARQUE) SELECT * FROM '+@SQL''

    SET @SQL = @SQL + '(''Microsoft.ACE.OLEDB.12.0'',''Data Source='
    SET @SQL = @SQL + @FilePath + ';Extended Properties=''''Excel 12.0;HDR=' 
    SET @SQL = @SQL + @HDR + ''''''')...[' 
    SET @SQL = @SQL + @SheetName + ']'

    SET @SQL1 = @SQL1 + '(''Microsoft.ACE.OLEDB.12.0'',''Data Source='
    SET @SQL1 = @SQL1 + @FilePath + ';Extended Properties=''''Excel 12.0;HDR=' 
    SET @SQL1 = @SQL1 + @HDR + ''''''')...[' 
    SET @SQL1 = @SQL1 + @SheetName + ']'
    SET @SQL1 = @SQL2 + '(''Microsoft.ACE.OLEDB.12.0'',''Data Source='
    SET @SQL1 = @SQL2 + @FilePath + ';Extended Properties=''''Excel 12.0;HDR=' 
    SET @SQL1 = @SQL2 + @HDR + ''''''')...[' 
    SET @SQL1 = @SQL2 + @SheetName + ']'

    EXEC sp_executesql @SQL
    EXEC sp_executesql @SQL1
    EXEC sp_executesql @SQL2
END

在第一个查询 @SQL 中,我从表 Material 中检索所有 ID,其中 name(marque) 与 Excel 表中的 ID 相同。

在第二个查询 @SQL1 中,我将 Excel 工作表中的 serviceTag 值插入到表中

在最后一个 @SQL2 中,我将从第一个查询中检索到的 ID 插入到表材料中

我的逻辑正确吗?这是我应该如何进行的吗?请问我需要帮助!!

【问题讨论】:

    标签: sql-server excel sql-server-2008


    【解决方案1】:

    尝试更改此行:

    SET @SQL2 = 'INSERT INTO Material (MARQUE) SELECT * FROM '+@SQL''
    

    为此 - 即将@SQL 用括号括起来:

    SET @SQL2 = 'INSERT INTO Material (MARQUE) SELECT * FROM (' + @SQL + ')'
    

    【讨论】:

      【解决方案2】:

      我找到了解决方案,这很简单,从一开始就应该想到它。我将所有数据从我的 excel 表导入到一个临时表中,然后从我的标记表中获取所有 ID 并将它们直接插入到我的材料表中。 这就是我实现这一目标的方式

      USE [AxaStock]
      GO
      
      
      ALTER PROCEDURE [dbo].[spx_Import]
          @SheetName varchar(20),
          @FilePath varchar(100),
          @HDR varchar(3),
          @TableName varchar(50)
      AS
      BEGIN
          DECLARE @SQL nvarchar(1000)
          DECLARE @QUERY nvarchar(1000)
              SET @SQL = 'INSERT INTO ESSAIE (serviceTag, periodeGarantie, periodeLeasing, marque, designation, serie, entite, dateDG, nCommande) SELECT serviceTag, periodeGarantie, periodeLeasing, marque, designation, serie, entite, dateDG, nCommande FROM OPENDATASOURCE'
              SET @QUERY = 'insert into Materiel (serviceTag, idMarque, idTypeMateriel, idSerieMateriel) select distinct serviceTag, idMarque, idTypeMateriel, '+
              'idSerieMateriel from ESSAIEIMPORT ess, MarqueMateriel mm, Serie s, TypeMateriel tm where mm.marque=ess.marque and tm.nomType=ess.designation and '+
              's.serieMateriel=ess.serie delete from ESSAIEIMPORT'    
          SET @SQL = @SQL + '(''Microsoft.ACE.OLEDB.12.0'',''Data Source='
          SET @SQL = @SQL + @FilePath + ';Extended Properties=''''Excel 12.0;HDR=' 
          SET @SQL = @SQL + @HDR + ''''''')...[' 
          SET @SQL = @SQL + @SheetName + ']'
          EXEC sp_executesql @SQL
          EXEC sp_executesql @QUERY
      
      
      END
      

      【讨论】:

        猜你喜欢
        • 2012-11-23
        • 2017-04-08
        • 1970-01-01
        • 2017-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多