Я все еще верю, что процедура CLR может быть лучшим выбором. Итак, я принимаю этот ответ. Впрочем, либо я не такой яркий, либо это крайне сложно реализовать. Наша служба SQL Server работает под локальной учетной записью, потому что, согласно Mircosoft, это единственный способ получить связанный сервер iSeries, работающий из 64-битного экземпляра SQL Server 2005. Когда мы изменяем службу SQL Server на запуск с учетной записью домена, команда xp_fileexist прекрасно работает с файлами, расположенными в сети.
Я создал эту хранимую процедуру CLR и собрал ее с уровнем разрешений, установленным в External, и подписал ее:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Security.Principal;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void FileExists(SqlString fileName, out SqlInt32 returnValue)
{
WindowsImpersonationContext originalContext = null;
try
{
WindowsIdentity callerIdentity = SqlContext.WindowsIdentity;
originalContext = callerIdentity.Impersonate();
if (System.IO.File.Exists(Convert.ToString(fileName)))
{
returnValue = 1;
}
else
{
returnValue = 0;
}
}
catch (Exception)
{
returnValue = -1;
}
finally
{
if (originalContext != null)
{
originalContext.Undo();
}
}
}
}
Затем я запустил следующие команды TSQL:
USE master
GO
CREATE ASYMMETRIC KEY FileUtilitiesKey FROM EXECUTABLE FILE = 'J:\FileUtilities.dll'
CREATE LOGIN CLRLogin FROM ASYMMETRIC KEY FileUtilitiesKey
GRANT EXTERNAL ACCESS ASSEMBLY TO CLRLogin
ALTER DATABASE database SET TRUSTWORTHY ON;
Затем я развернул хранимый процесс CLR в своей целевой базе данных из Visual Studio и использовал этот TSQL для выполнения из SSMS, вошедшей с аутентификацией Windows:
DECLARE @i INT
--EXEC FileExists '\\\\server\\share\\folder\\file.dat', @i OUT
EXEC FileExists 'j:\\file.dat', @i OUT
SELECT @i
Пытаюсь ли я использовать локальный файл или сетевой файл, я всегда получаю 0. Я могу повторить попытку позже, но сейчас я попытаюсь пойти другим путем. Если бы у кого-то был свет, он был бы очень признателен.