扩展存储过程是一个 extern C 或 C++ 函数,该函数从 Win32 DLL 导出,并可以从 SQL Server 内部进行调用。扩展存储过程的调用方式类似于存储过程,但像任何已编译的进程一样在服务器上运行。与需要使用 SQL 语句的 SQL Server 存储过程不同,扩展存储过程使您可以使用 Win32 API。
编写好扩展存储过程后,固定服务器角色 sysadmin 的成员即可在 SQL Server 中注册该扩展存储过程,然后授予其他用户执行该过程的权限。扩展存储过程只能添加到 master 数据库中。
下面这段代码是我自己做的一个外部存储过程,功能是传入一个文件名称,然后修改指定文件名称的文件内容。
using System;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.IO;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.IO;
[assembly: AssemblyTitle("xChange")]
[assembly: AssemblyDescription("Test SQL .NET interop")]
[assembly: AssemblyVersion("1.0.0.1")]
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("MyKey.snk")]
namespace SQLInterop
{
[ClassInterface(ClassInterfaceType.AutoDual)]
public class ChangeCache
{
public string xChangetxt(string strname)
{
if(File.Exists("f:\\CacheTest\\" + strname + ".txt"))
{
StreamWriter sw = new StreamWriter("f:\\CacheTest\\" + strname + ".txt",false);
sw.WriteLine(DateTime.Now.ToString() + " " + DateTime.Now.Millisecond.ToString());
sw.Close();
return "OK";
}
else
{
return "FAIL";
}
}
}
}
[assembly: AssemblyDescription("Test SQL .NET interop")]
[assembly: AssemblyVersion("1.0.0.1")]
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("MyKey.snk")]
namespace SQLInterop
{
[ClassInterface(ClassInterfaceType.AutoDual)]
public class ChangeCache
{
public string xChangetxt(string strname)
{
if(File.Exists("f:\\CacheTest\\" + strname + ".txt"))
{
StreamWriter sw = new StreamWriter("f:\\CacheTest\\" + strname + ".txt",false);
sw.WriteLine(DateTime.Now.ToString() + " " + DateTime.Now.Millisecond.ToString());
sw.Close();
return "OK";
}
else
{
return "FAIL";
}
}
}
}