3

我必须将 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。

4

2 回答 2

1

另一种方法是在 SQL Server 代理作业中将这两行分为两个不同的步骤,并使用一条指令执行它:

sp_start_job nameOfYourJob

工作的两个步骤就像中间有一个 GO。

于 2013-03-10T16:11:49.853 回答
0

您是否尝试在 exec 语句之后添加 GO?

您连接到 SQL Server 的帐户是否具有对 SQL Temp 目录的读/写访问权限?我的理解是 SQL 会将 xls 文件复制到它的临时目录,如果您的用户没有管理员权限或 Windows 对临时目录的读/写权限,则连接将失败。

于 2013-03-04T22:24:31.310 回答