我正在维护一个访问单独服务器上的数据库(SQL Server 2012)的经典 ASP Web 应用程序。
这个遗留应用程序有很多集成工作。其中很多涉及在数据库服务器上托管的导入文件。这些由 SQL Server 代理作业运行并由 ASP COM+ 对象启动的 SSIS 包处理
我希望能够在运行导入包之前检查数据库服务器(与 Web 服务器分开)上是否存在导入文件。所以它应该能够失败并返回一个错误,表明一个文件没有找到。
我们的数据库和网络服务器曾经在同一台机器上。现在他们已经分开了。
此功能应该是通用的,以便我可以将其应用于所有导入,理想情况下,将文件路径作为参数传递。
在该环境和经典 ASP 限制下,这些是我考虑过的选项:
a)向运行 TSQL 的 SQL Server 代理作业添加一个步骤如下:
- 步骤发生在调用 SSIS 导入包/或作为单独作业运行的步骤之前。
- 它依赖于 SQL Server 代理作业“成功”或“失败”返回分别指示文件找到或未找到
问题:据我所知,它不是通用的。这意味着每种导入类型都有一个作业,因为一次只能处理一个作业,并且作业不支持参数(is)。
b)使用未记录的xp_fileexist
存储过程如下
CREATE PROCEDURE [dbo].[spFileExists]
@fpath varchar(255)
AS
begin
DECLARE @fexists int
EXEC master.dbo.xp_fileexist @fpath, @fexists output
SELECT cast(@fexists as bit)
end
GO
问题:我已经测试过这种方法,它访问的是 WEBSERVER 的文件系统,而不是 DATABASE 服务器的预期文件系统。如果我使用预期的路径将文件放在 Web 服务器中,它会返回 1 表示它在那里。如果我删除它并放在数据库服务器中,从 Web 服务器中删除,它返回 0。
为什么要检查 Web 服务器文件系统?
c)以 .NET 语言创建 SQL Server CLR 程序集并尝试使用 .NET 文件系统操作来访问数据库文件系统。还没试过
d)使用 sqlcmd 还没试过
任何最佳实践或经验都会很有帮助。