Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从Excel读取到SQL-列类型错误_Sql Server_Excel_Tsql_Type Conversion_Openrowset - Fatal编程技术网

Sql server 从Excel读取到SQL-列类型错误

Sql server 从Excel读取到SQL-列类型错误,sql-server,excel,tsql,type-conversion,openrowset,Sql Server,Excel,Tsql,Type Conversion,Openrowset,我有这样的程序从许多excel文件中读取数据: IF EXISTS ( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'GetDataFromFiles') AND type IN ( N'P', N'PC' ) ) DROP PROCEDURE GetDataFromFiles GO CREATE PROCEDURE GetDataFromFiles ( @Months VARCHAR(5

我有这样的程序从许多excel文件中读取数据:

IF EXISTS ( SELECT * FROM sys.objects
            WHERE object_id = OBJECT_ID(N'GetDataFromFiles') AND type IN ( N'P', N'PC' ) ) 
    DROP PROCEDURE GetDataFromFiles
GO
CREATE PROCEDURE GetDataFromFiles (
    @Months VARCHAR(50),
    @Excels_path VARCHAR(200),
    @File_name VARCHAR(15),
    @Workbook_name VARCHAR(50),
    @Table_name VARCHAR(15),
    @First_run INT)
AS
    DECLARE @Query VARCHAR(5000)

    IF(@First_run = 1)
        SET @Query = 'SELECT * INTO '+@Table_name
    ELSE 
        SET @Query = 'INSERT INTO '+@Table_name+' SELECT * '

    SET @Query +='
            FROM openrowset(''Microsoft.ACE.OLEDB.12.0'', 
                ''Excel 12.0 Xml;Database='+@Excels_path+'\'+@File_name+'.xlsx;HDR=Yes;IMEX=1'', 
                ''SELECT * FROM ['+@Workbook_name+'$]'')'
    --Print @Query
    EXEC (@Query)
GO
我的问题是,当存在
First_run=1
时,具有空值的列将作为浮点值。在下一步中(在下一个excel文件中),这些列中可能是字符串,然后我有一个错误:
将数据类型nvarchar转换为float时出错。
。如何避免出现此错误?

我曾尝试创建另一个#temp表,其中每列(可能有空值)都可以转换为varchar,但我认为这太复杂了,因为我创建此过程是为了简化查询。

如果Excel中的列应该是整数,为什么它应该有字符串值?或者你是指一个空字符串吗?正如你所看到的,这个错误表示查询想要将varchar转换为float,所以在我所说的列中是字符串。当然,这里有带int的列——当第一次插入的列中有null值时,它是OK的,但当第一步中有一个
null
时,它不是OK的,在第二步中(在其他文件中),该列中有
abc
值。在excel中不可能是空字符串,对吗?我相信一个单元格如果有空值,就会被算作空字符串。我还认为空值应该用这种方式表示,而不是用
'NULL'
字符串值。此外,如果内存正常,则提供程序会从第一个数据行猜测Excel文件的列类型。因此,如果您的第一行中有一个字符串(不是空的?),则提供程序将为该列假定一个NVarChar类型。让我们再说一次:当第一个文件中只有列中的空值时,例如
Description
,它应该是字符串,当下一个文件中有字符串时,会出现错误,因为在第一步中,
openrowset
函数将列读取为float。所以在我的例子中,当第一个文件的列中有空值时,它们将作为浮点值,而不是字符串。如果需要,请在计算机上检查导入示例两个excel文件。编写动态查询以更改表,并在第一次运行后将所有列更改为varchar。事情会变得复杂的。做你想做的事没有简单的方法。