好吧,SQL Server 本身无法做到这一点,因此无论如何您都必须稍微走出自己的舒适区。另外,“在服务器上”是指在运行 SQL Server 的同一物理服务器上,还是指“在 SQL Server 实例内部”?
您当然可以在存储过程中从 xp_cmdshell 调用本地 PowerShell 脚本,或者如果您需要它是异步的(并且如果您没有运行 Express Edition,它不会作为 SQL Server 代理作业步骤的一部分)没有代理)。这是一个 PowerShell 脚本,它不需要最终掌握 PowerShell 来适应您的需求:
Automating Telnet with PowerShell
为了在存储过程中调用它,您首先需要确保xp_cmdshell 已启用:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
GO
EXEC sp_configure 'xp_cmdshell', 1;
EXEC sp_configure 'show advanced options', 0;
RECONFIGURE WITH OVERRIDE;
GO
作为警告,很多人认为暴露xp_cmdshell 是一种类似禽流感的流行病。对我来说,这完全是关于控制对机器的访问,而不是控制机器可以做什么和不能做什么来满足您的业务需求。
这里是使用您发送到xp_cmdhsell 的任何内容的输出的快速示例。这只是一个标准的命令行调用,因此您必须对其进行调整以调用 PowerShell 脚本,但它的工作原理应该大致相同:
CREATE TABLE #tmp(i INT IDENTITY(1,1), x VARCHAR(2048));
INSERT #tmp(x) EXEC master..xp_cmdshell 'dir C:\Users\';
SELECT x FROM #tmp ORDER BY i;
DROP TABLE #tmp;
结果:
Volume in drive C has no label.
Volume Serial Number is 50D3-008B
NULL
Directory of C:\Users
NULL
01/10/2012 09:20 AM <DIR> .
01/10/2012 09:20 AM <DIR> ..
01/19/2011 11:54 PM 1,444 SomeFile.txt
.... other files...
3 File(s) 28,918,500 bytes
18 Dir(s) 19,367,292,416 bytes free
NULL
但是,一旦您花了一个多小时来处理它以使其正常工作,我认为您最好编写一个作为服务或间隔运行的应用程序,检查队列表是否有新的telnet 处理,完成工作,然后将结果写入 SQL Server。恕我直言,您的 RDBMS 不应被视为批处理脚本主机。