SQL 从 openrowset 混合类型导入 [保持前导 0、long ints 和 TEXT] 正确
SQL import from openrowset mixed type [keep leading 0, long ints and TEXT] correctly
我在 Excel 中有一列我正在尝试导入,它包含如下代码:
- 01166
- 1166
- 2354654765432
- xx132
我使用 IMEX=1 并且所有内容都作为 TEXT 导入,但是当我将 select 分配给具有 nvarchar 类型的临时 table 时,长数字的代码变得不正确:
1001051 becomes 1.00105e+006
我尝试转换为 bigint,但这会使代码丢失 01166
中的前导 0
这是我当前的查询:
INSERT INTO #XTEMP
SELECT DISTINCT
(CASE ISNUMERIC([item_code]) WHEN 1 THEN CAST(CAST([item_code] AS BIGINT) AS nvarchar) ELSE CAST([item_code] AS nvarchar) END)
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0 Xml;HDR=YES;IMEX=1;Database=C:\path\file.xls',
'SELECT * FROM [sheet$]')
IMEX=1
允许读取混合列;它不会强制数据值是文本。
查看 this SO page,如果您设置 HDR=NO
,您可以看到一个可能的解决方法,但这有其自身的复杂性。
如果可以,最好将电子表格中列的格式设置为文本。
不完全是修复,但更像是一种解决方法;我写了一个 Excel 宏,在代码中附加了一个字符(例如 'B'),然后在使用 Openrowset 导入时将其删除,例如:
select RIGHT([code], LEN([code])-1)
我在 Excel 中有一列我正在尝试导入,它包含如下代码:
- 01166
- 1166
- 2354654765432
- xx132
我使用 IMEX=1 并且所有内容都作为 TEXT 导入,但是当我将 select 分配给具有 nvarchar 类型的临时 table 时,长数字的代码变得不正确:
1001051 becomes 1.00105e+006
我尝试转换为 bigint,但这会使代码丢失 01166
这是我当前的查询:
INSERT INTO #XTEMP
SELECT DISTINCT
(CASE ISNUMERIC([item_code]) WHEN 1 THEN CAST(CAST([item_code] AS BIGINT) AS nvarchar) ELSE CAST([item_code] AS nvarchar) END)
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0 Xml;HDR=YES;IMEX=1;Database=C:\path\file.xls',
'SELECT * FROM [sheet$]')
IMEX=1
允许读取混合列;它不会强制数据值是文本。
查看 this SO page,如果您设置 HDR=NO
,您可以看到一个可能的解决方法,但这有其自身的复杂性。
如果可以,最好将电子表格中列的格式设置为文本。
不完全是修复,但更像是一种解决方法;我写了一个 Excel 宏,在代码中附加了一个字符(例如 'B'),然后在使用 Openrowset 导入时将其删除,例如:
select RIGHT([code], LEN([code])-1)