场合: 我们每月收到统计来源数据。它是一张带有Access数据库的CD,其中包含两个表。所以我们有1 * .mdb文件,里面有2个表。分析师应该能够导入数据,计算和标准化并检查结果。如果结果是精确的数据填充。分析师不是程序员,他们没有SQLServerManagementStudio。
我的任务: 要为具有按钮的分析师创建访问表单作为前端:导入,计算,检查,填充。每个按钮都会触发查询,该查询在sql server的一侧运行存储过程。
我的问题: 我的项目的瓶颈是数据导入。它应该自动完成(不要手动完成,因为分析师没有安装管理工作室)。
我尝试了什么:
1)我将SQL服务器的表链接到访问权限并尝试使用常规查询进行复制(INSERT INTO ** FROM * ),但这需要很长时间。 (我在两个表中有大约400万行)
2)因为我喜欢BULK INSERT无法从访问文件导入。
3)OPENROWSET方法:
SELECT *
FROM OPENROWSET( 'Microsoft.Jet.OLEDB.4.0','\\euro-dc\DOTS\2014\dots.mdb';'admin';'',TimeSeries)
这会给我带来错误:
Msg 7308,Level 16,State 1,Line 1 OLE DB提供程序 ' Microsoft.Jet.OLEDB.4.0'不能用于分布式查询 因为提供程序配置为在单线程单元中运行 模式。
Openrowset解决方案不是优选的。我想避免它。因为它可以在某些计算机上运行,并且因为OLDB驱动程序而无法在其他计算机上运行。 Windows重新安装后需要检查OLEDB驱动程序......由于有15位分析师,因此不太舒服。只有在没有其他方法导入数据的情况下。
\ euro-dc \ dots文件夹可供sql server访问 - 它在我的其他项目中进行测试。
会欣赏任何新鲜的想法。 感谢
答案 0 :(得分:2)
使用导入向导并保存要导入的每组数据的导入规范。然后在执行导入规范的按钮下编写一些代码/宏。 您导入的表可以在Access中构建,然后升迁到SQL Svr。
400万个recs会变慢,所以你可能想把它放在一个单独的MDB中,这样就不会占用你分析师工作的MDB。
答案 1 :(得分:2)
由于您正在处理大量记录,因此应考虑索引可能对数据导出/导入过程的性能产生的影响。某些人在您的情况下用来加快速度的技术是首先将源数据导出为方便的中间文件格式(CSV或其他),删除目标表上的索引,执行BULK INSERT以提取中间文件数据进入目标表,然后在BULK INSERT完成后最终在目标表上重新创建索引。
这可以显着提高性能,因为在最后(一次)重新创建索引通常比在一次插入一行时发生的所有索引更新的总和快得多。
我相信您应该能够使用VBA和T-SQL传递查询以编程方式实现上述每个步骤。
希望它有所帮助。祝你的项目好运。
答案 2 :(得分:1)
如果您在下面的查询行中使用某些内容,它将从MS Access运行。您还可以选择传递查询,或者更好的是,提供一些代码来提供参数。
INSERT INTO
[ODBC;DRIVER=SQL Server;Server=servername;Database=dbname;Integrated Security=SSPI].Table1
SELECT * FROM Table1
获取正确连接字符串的最简单方法是链接表,然后检查connect属性。
您还可以在http://connectionstrings.com
找到连接字符串一些例子,请注意,虽然名称用作参考,但它实际上是重要参数的顺序。在大多数情况下,我会检查是否有连接,以节省时间。
MS Access中的查询
Set db = CurrentDb
sSQL = "INSERT INTO dbo_LocationLocationType (LocationID,LocationTypeID) VALUES (@LocationId,@LocationName)"
Set qdf = db.CreateQueryDef("", sSQL)
qdf.Parameters![@LocationId] = LocationID
qdf.Parameters![@LocationName] = LocationName
qdf.ReturnsRecords = False
qdf.Execute dbFailOnError
存储过程
Dim cmd As New ADODB.Command
Dim prm As ADODB.Parameter
With cmd
.ActiveConnection = "insert connection string"
.CommandType = adCmdStoredProc
.CommandText = "NameofStoredProcedure"
Set prm = .CreateParameter("@LocationID", adInteger, adParamInput)
prm.Value = frm.txtLocationID
.Parameters.Append prm
Set prm = .CreateParameter("@LocationName", adVarWChar, adParamInput, 255)
prm.Value = frm.txtLocationDetailName
.Parameters.Append prm
.Execute
End With