【发布时间】:2013-03-11 00:11:49
【问题描述】:
我必须将 Excel 模板复制到另一个文件夹才能导入数据。以下是我正在使用的两个 SQL 语句:
声明1:
exec xp_cmdshell 'copy C:\inetpub\wwwroot\app_data\export_templates\myExport.xlsx C:\inetpub\wwwroot\app_data\tmp\myExport130301172218.xls'
声明2:
insert into
OPENROWSET('Microsoft.ACE.OLEDB.12.0'
, 'Excel 12.0;Database=C:\inetpub\wwwroot\app_data\tmp\myExport130301172218.xls;'
, 'SELECT * FROM [Sheet1$]')
SELECT * FROM vw_shrub
如果我单独执行上述 SQL 语句,它们就可以正常工作。但是如果我一起执行它们,则会引发以下错误:
链接服务器“(null)”的 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”返回消息“Microsoft Access 数据库引擎找不到对象 'Sheet1$'。请确保该对象存在并且您拼写它的名称和路径名正确。如果“Sheet1$”不是本地对象,请检查您的网络连接或联系服务器管理员。”。
消息 7350,第 16 层,状态 2,第 2 行
无法从链接服务器“(null)”的 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”获取列信息。
问题是我想从我的应用程序中将它们作为单个请求传递。因此,我必须一起执行它们。我发现如果我在它们之间添加 GO,我可以在 Management Studio 中一起执行它们。但是当我传递来自我的应用程序的请求时,我无法使用 GO。
【问题讨论】:
-
为什么副本中的路径与OPENROWSET中的路径不同
-
对不起斯佩特。当我在我的问题中编写示例时,这是一个错误。但问题仍然存在。我更新了问题。谢谢。
-
为什么不创建一个存储过程并从您的应用程序中调用该过程
-
嗨,Raymund,我不确定我是否明白你的意思,但这实际上是我正在做的。我将上述代码的两部分作为一个存储过程运行。
-
使用
xp_cmdshell是generally considered bad practice,尤其是在应用程序中。就我个人而言,我不会在 SQL Server 中执行任何。您必须考虑到数据库服务器和应用程序服务器通常不是同一台计算机这一事实。我会获取数据并从应用程序本身构建它。话题上有other questions。
标签: sql-server-2008