使用 Excel 多值列从 Excel 导出到 SQL 服务器
Export from Excel to SQL Server with Excel Column of Multiple Values
虽然我有一些 SQL 技能,但我对数据库设计还很陌生。我有一个 excel sheet 我想上传到 SQL 服务器。问题是我在 Excel 中有一列有多个值,用“/”分隔。
例如:
Fruit
Banana/Pear/Orange
Pear/Raspberry/...
Banana
...
我想根据“/”分割单元格,我做得很好。然后将值放入 SQL 服务器中的 table。但是,Excel 单元格中没有定义的 "Fruits" 数量,因此我需要允许多个 table 字段。
有人对如何执行此操作有建议吗?我编写了一个 ADODB 连接以从 Excel 导出到 SQL 服务器,但不知道如何处理此单元格。
谢谢
使用 Bridge Table。这样 Fruit table 中的每一行都可以有 N 种类型。
table 类型中的描述值将是香蕉、梨、橙子、覆盆子等
另一种选择是在加载数据后拆分数据。例如
Declare @YourTable table (ID int,Fruit varchar(150))
Insert into @YourTable values
(1,'Banana/Pear/Orange'),
(2,'Pear/Raspberry/Apple'),
(3,'Banana')
Select A.ID
,B.Key_Value
From @YourTable A
Cross Apply (Select * from [dbo].[udf-Str-Parse](A.Fruit,'/')) B
Returns
ID Key_Value
1 Banana
1 Pear
1 Orange
2 Pear
2 Raspberry
2 Apple
3 Banana
UDF
CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimeter varchar(10))
--Usage: Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',')
-- Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ')
Returns @ReturnTable Table (Key_PS int IDENTITY(1,1), Key_Value varchar(max))
As
Begin
Declare @XML xml;Set @XML = Cast('<x>' + Replace(@String,@Delimeter,'</x><x>')+'</x>' as XML)
Insert Into @ReturnTable Select ltrim(rtrim(String.value('.', 'varchar(max)'))) FROM @XML.nodes('x') as T(String)
Return
End
当您设计 table 时,它必须具有定义的列数。
最简单的方法是为每个组分配一个 ID。
ID Fruit
1 Banana
1 Pear
1 Orange
2 Pear
2 Raspberry
3 Banana
虽然我有一些 SQL 技能,但我对数据库设计还很陌生。我有一个 excel sheet 我想上传到 SQL 服务器。问题是我在 Excel 中有一列有多个值,用“/”分隔。
例如:
Fruit
Banana/Pear/Orange
Pear/Raspberry/...
Banana
...
我想根据“/”分割单元格,我做得很好。然后将值放入 SQL 服务器中的 table。但是,Excel 单元格中没有定义的 "Fruits" 数量,因此我需要允许多个 table 字段。
有人对如何执行此操作有建议吗?我编写了一个 ADODB 连接以从 Excel 导出到 SQL 服务器,但不知道如何处理此单元格。
谢谢
使用 Bridge Table。这样 Fruit table 中的每一行都可以有 N 种类型。
table 类型中的描述值将是香蕉、梨、橙子、覆盆子等
另一种选择是在加载数据后拆分数据。例如
Declare @YourTable table (ID int,Fruit varchar(150))
Insert into @YourTable values
(1,'Banana/Pear/Orange'),
(2,'Pear/Raspberry/Apple'),
(3,'Banana')
Select A.ID
,B.Key_Value
From @YourTable A
Cross Apply (Select * from [dbo].[udf-Str-Parse](A.Fruit,'/')) B
Returns
ID Key_Value
1 Banana
1 Pear
1 Orange
2 Pear
2 Raspberry
2 Apple
3 Banana
UDF
CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimeter varchar(10))
--Usage: Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',')
-- Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ')
Returns @ReturnTable Table (Key_PS int IDENTITY(1,1), Key_Value varchar(max))
As
Begin
Declare @XML xml;Set @XML = Cast('<x>' + Replace(@String,@Delimeter,'</x><x>')+'</x>' as XML)
Insert Into @ReturnTable Select ltrim(rtrim(String.value('.', 'varchar(max)'))) FROM @XML.nodes('x') as T(String)
Return
End
当您设计 table 时,它必须具有定义的列数。
最简单的方法是为每个组分配一个 ID。
ID Fruit
1 Banana
1 Pear
1 Orange
2 Pear
2 Raspberry
3 Banana