我有一个excel工作簿,里面有很多工作表。 每个工作表都有表示架构的数据。 问题是数据没有标题行,但它有一个标题“列”。此外,数据仅包含在表格的第7至第13行中,即:
Field Name | Swap ID | Allocation ID | Description | Broker ID ...
Field Type | Alphanumeric| Alphanumeric | Alphanumeric| Alphanumeric ...
Field Length| char(40) | char(40) | char(100) | char(50) ....
...
如何将这些工作表中的一个导入到具有以下结构的数据库表中?
Field Name | Field Type | Field Length | ...
注意:我的问题不仅仅是跳过行内容,而是如何“转动”数据,以便我的数据由列布局,而是由行。
编辑:感谢praveen的回答,我能够使用Select * from [Sheet$A7:AZ13]
语法处理使用特定范围的单元格的要求,但导入数据的主要问题基本上已转为在它的一边仍然存在。
答案 0 :(得分:1)
试试这个: -
第1步:创建Excel Connection Manager
时,选择First Rows as Column name
第2步:在excel源代码中使用SQL Command
Data access mode
并编写查询以跳过初始行
SELECT * FROM [Sheet1$A7:B]
答案 1 :(得分:0)
在一张Excel工作表和另一张工作表之间可能存在许多可能发生变化的事情。因此,仅将此解决方案用作起点。 如果您有任何疑问,请告诉我们。 ( - ;免责声明; - )
我创建了一个如下所示的Excel文件:
字段名称|交换ID |分配ID |说明|经纪人ID
字段类型|字母数字|字母数字|字母数字|字母数字
场长| char(40)| char(40)| char(100)|炭(50)
CREATE TABLE [dbo]。[STG_Sheet1] (
[F1] varchar为NULL ,[F2] varchar为NULL ,[F3] varchar为NULL ,[F4] varchar NULL ,[F5] varchar为NULL )[主要]
现在,创建一个新的SSIS包。
2.1创建以下变量:
2.1.1 oFieldList; Data type: Object
2.1.2 sColumn; Data type: String, Value: F2
2.1.3 sSql; Data type: String, Value: "SELECT " + @[User::sColumn] + " AS COL FROM [dbo].[STG_Sheet1]"
2.1.4 sSQLInsert; Data type: String
2.1.5 sValues; Data type: String
2.2放置脚本任务。
2.2.1 Result Set: Full result set
2.2.2 SQL Statement:
SELECT sac.name as ColumnName FROM sys.all_columns sac
INNER JOIN sys.all_objects sao ON sao.object_id = sac.object_id
WHERE sao.name = 'STG_Sheet1' AND sac.name <> 'F1'
2.2.3 Result Set: Result Name: 0; Variable Name: User::oFieldList
2.3放置一个ForEach循环容器
2.3.1 Enumerator: Foreach ADO Enumerator
2.3.2 ADO object source variable: User::oFieldList
2.3.3 Variable Mappings: User::sColumn: 0
现在,在ForEach循环容器内
2.4放置DFT
2.4.1 Place an OLE DB Source
2.4.1.1 Data access mode: SQL Command from variable
2.4.1.2 Variable name: sSQL
2.4.1.3 Columns: COL
2.4.2 Place a Script component as Transformation
2.4.2.1 Input Columns: COL : ReadOnly
2.4.2.2 Script: ReadWrite Variables:User::sValues
2.4.2.3 Edit Script : Code below
public class ScriptMain : UserComponent
{
string colValue = string.Empty;
public override void PreExecute()
{
base.PreExecute();
}
public override void PostExecute()
{
base.PostExecute();
string x = Variables.sValues;
int iFirstCommaAt = colValue.IndexOf (',');
colValue = colValue.Substring(iFirstCommaAt + 1);
Variables.sValues = colValue;
}
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
string x = Row.COL;
colValue = string.Format("{0},'{1}'", colValue, x);
}
}
2.5放置脚本任务:
2.5.1 ReadOnlyVariables: User::sValues
2.5.2 ReadWriteVariables: User::sSQLInsert
2.5.3 Edit Script: Code below
public void Main()
{
string s = "INSERT INTO dbo.SHEET1 ([Field Name], [Field Type], [Field Length]) VALUES ";
string sValue = Dts.Variables["User::sValues"].Value.ToString();
string sSQLInsert = string.Empty;
Dts.Variables["User::sSQLInsert"].Value = string.Format("{0} ({1})", s, sValue);
Dts.TaskResult = (int)ScriptResults.Success;
}
2.6发出执行SQL任务
2.6.1 SQLSourceTyoe: Variable
2.6.2 SourceVariable: User::sSQLInsert
答案 2 :(得分:0)
你也可以尝试这个: (将Excel工作表加载到临时表后,从SSMS运行以下脚本:
SELECT * FROM [dbo].[STG_Sheet1]
SELECT * FROM [dbo].[Sheet1]
DECLARE @CETList2 varchar(300); DECLARE @CETList3 varchar(300);
DECLARE @CETList4 varchar(300); DECLARE @CETList5 varchar(300);
DECLARE @INSERT varchar(1000) DECLARE @EXEC_INSERT varchar(1000);
SET @INSERT = 'INSERT INTO dbo.SHEET1 ([Field Name], [Field Type],[Field Length]) VALUES';
SELECT
@CETList2 = COALESCE(@CETList2 + ',', '') + '''' + LTRIM(RTRIM(CAST(CETL.[F2] AS Varchar))) + ''''
, @CETList3 = COALESCE(@CETList3 + ',', '') + '''' + LTRIM(RTRIM(CAST(CETL.[F3] AS varchar))) + ''''
, @CETList4 = COALESCE(@CETList4 + ',', '') + '''' + LTRIM(RTRIM(CAST(CETL.[F4] AS varchar))) + ''''
, @CETList5 = COALESCE(@CETList5 + ',', '') + '''' + LTRIM(RTRIM(CAST(CETL.[F5] AS varchar))) + ''''
FROM [dbo].[STG_Sheet1] CETL
SET @EXEC_INSERT = @INSERT + '(' + @CETList2 + ')';
EXECUTE (@EXEC_INSERT)
SET @EXEC_INSERT = @INSERT + '(' + @CETList3 + ')';
EXECUTE (@EXEC_INSERT)
SET @EXEC_INSERT = @INSERT + '(' + @CETList4 + ')';
EXECUTE (@EXEC_INSERT)
SET @EXEC_INSERT = @INSERT + '(' + @CETList5 + ')';
EXECUTE (@EXEC_INSERT)
SELECT * FROM [dbo].[Sheet1]