获取Excel工作表并插入SQL Server 2008数据库

时间:2014-07-22 14:11:26

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

我想将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列,获取所有的marque值,将值与我表中的值进行比较,获取所有ID,最后插入Ids进入我的桌子材料。

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

  

关键字'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中,我从表格中检索所有ID,其中名称(marque)等于Excel表格中的名称。

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

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

我的逻辑是否正确?这是我应该怎么做?我需要帮助!!

2 个答案:

答案 0 :(得分:0)

尝试更改此行:

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

对此 - 即用括号包装@SQL:

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

答案 1 :(得分:0)

我找到了解决方案,它非常简单,应该从第一次开始就考虑它。我将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