导出excel的话, 可以使用bcp等方式直接导出就行了,直接根据用户的选择,生成类似如下的SQL语句, INSERT INTO OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=C:\testing.xls;', 'SELECT Name, Date FROM [Sheet1$]') SELECT [Name], GETDATE() FROM msdb.dbo.sysjobs GO 非要使用SSIS的话, 就按照我说的, 程序开发一个页面给用户选择表和栏位, 然后拼接成SQL脚本,作为全局变量的参数传给source的查询语句那个属性值即可. 然后在source的查询语句中使用动态SQL完成就可以了,
感谢啊感谢!我自己做了个例子,但不好使,具体做法是这样:我先建了个脚本任务,让用户输入要导入的单元格的左上角和右下角, 比如用户输入a1,b2,我就生成一个sql语句select * from [sheet1$a1:b2] , 我将这个语句存储到变量里,然后建了个数据流任务,用oledb数据源连接excel,测试连接没有问题, 在oledb数据源中的数据访问模式,我选择变量中的sql命令,变量名称为存储sql语句的变量,但这时必须给这个变量赋个初值, 就可以在脚本任务里生成新的sql语句了。但是有几个问题: 1.我最希望得到的结果是用户输入a1,b2,生成的sql语句是select [a1],[b2] from [sheet1$]。可是现在是个范围。而且不知道select语句的查找列能不能用参数?动态sql语句是怎么生成的? 2.我不知道导出的是哪几列,比如我给变量赋初值:select * from sheet1$,一共3列,但如果新生成的sql语句是查询2列的话,就会出错:外部元数据列集合与数据源列不同步。请问,这个怎么解决呢?谢谢,,小弟刚开始学,实在是不明白。
1.我最希望得到的结果是用户输入a1,b2,生成的sql语句是select [a1],[b2] from [sheet1$]。可是现在是个范围。而且不知道select语句的查找列能不能用参数?动态sql语句是怎么生成的? --作为参数可以传入就可以. 2.我不知道导出的是哪几列,比如我给变量赋初值:select * from sheet1$,一共3列,但如果新生成的sql语句是查询2列的话,就会出错:外部元数据列集合与数据源列不同步。请问,这个怎么解决呢? --这个你有多少列就导出多少列就OK了,不会报错的啊.
1.--作为参数可以传入就可以. 参数作为where条件可以,可以作为查找列么?比如我想导出A列和C列,输入A,C,能生成select [A],[C] from Sheet1$这样的语句么? 2.--这个你有多少列就导出多少列就OK了,不会报错的啊. 我在导出数据的时候没问题,可是向sqlserver目标导入的时候就出错了,因为我不知道导入的是哪列,所以没法映射啊,比如目标表有3列,而我只导出2列,就会出错:外部元数据列集合与数据源列不同步。
可以使用bcp等方式直接导出就行了,直接根据用户的选择,生成类似如下的SQL语句,
INSERT INTO OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'Excel 8.0;Database=C:\testing.xls;',
'SELECT Name, Date FROM [Sheet1$]')
SELECT [Name], GETDATE() FROM msdb.dbo.sysjobs
GO
非要使用SSIS的话,
就按照我说的,
程序开发一个页面给用户选择表和栏位,
然后拼接成SQL脚本,作为全局变量的参数传给source的查询语句那个属性值即可.
然后在source的查询语句中使用动态SQL完成就可以了,
比如用户输入a1,b2,我就生成一个sql语句select * from [sheet1$a1:b2] ,
我将这个语句存储到变量里,然后建了个数据流任务,用oledb数据源连接excel,测试连接没有问题,
在oledb数据源中的数据访问模式,我选择变量中的sql命令,变量名称为存储sql语句的变量,但这时必须给这个变量赋个初值,
就可以在脚本任务里生成新的sql语句了。但是有几个问题:
1.我最希望得到的结果是用户输入a1,b2,生成的sql语句是select [a1],[b2] from [sheet1$]。可是现在是个范围。而且不知道select语句的查找列能不能用参数?动态sql语句是怎么生成的?
2.我不知道导出的是哪几列,比如我给变量赋初值:select * from sheet1$,一共3列,但如果新生成的sql语句是查询2列的话,就会出错:外部元数据列集合与数据源列不同步。请问,这个怎么解决呢?谢谢,,小弟刚开始学,实在是不明白。
--作为参数可以传入就可以.
2.我不知道导出的是哪几列,比如我给变量赋初值:select * from sheet1$,一共3列,但如果新生成的sql语句是查询2列的话,就会出错:外部元数据列集合与数据源列不同步。请问,这个怎么解决呢?
--这个你有多少列就导出多少列就OK了,不会报错的啊.
参数作为where条件可以,可以作为查找列么?比如我想导出A列和C列,输入A,C,能生成select [A],[C] from Sheet1$这样的语句么?
2.--这个你有多少列就导出多少列就OK了,不会报错的啊.
我在导出数据的时候没问题,可是向sqlserver目标导入的时候就出错了,因为我不知道导入的是哪列,所以没法映射啊,比如目标表有3列,而我只导出2列,就会出错:外部元数据列集合与数据源列不同步。
我在oledb源中的“数据访问模式”选择的是“变量中的sql命令”,变量名称选择自己定义的变量”strsql”,
可是必须给strsql变量一个初始值,否则点击确定会出错。
在运行程序后,通过脚本任务重新生成strsql,由oledb源调用,如果新生成的查询strsql中的列比strsql初始值的列少,就会出错:外部元数据列集合与数据源列不同步,因为在设置初始值的时候已经设置好了映射关系,而新生成的列少,就有列没有映射,就会出错,要是列相同或者新生成的多,就没事,但是新生成的列也不会映射到目标里,因为没建立映射这个问题真头疼,可能有很简单的方式解决,但我不会。
谢谢hery!!!
再帮帮忙把。