我正在尝试通过SQL Server 2012打开一个Web URL,我们尝试了SQLCLR,但是它已经过时了,我们试图运行一个批处理文件,它会在执行过程中陷入困境
EXEC xp_cmdshell 'c:\PATH.bat'
这是我们用来打开批处理文件的代码然后它在执行查询时卡住了我等了5分钟仍然没有弹出
我们检查了文件权限,一切都被允许,这是我第四次尝试这个,我无法管理,有人可以给我看一个替代解决方案吗?
答案 0 :(得分:0)
虽然从SQL Server中访问URL有利有弊,但SQLCLR绝对不过时。即使您没有自定义程序集,它仍在内部用于以下几个方面:
FORMAT
,TRY_PARSE
等有关SQLCLR实际上和可以执行的操作的更多信息,请参阅我在SQL Server Central上撰写的关于此主题的一系列文章:Stairway to SQLCLR(需要免费注册才能阅读该网站上的内容,但是这很值得 :-)。 1级(“什么是SQLCLR?”)是对SQLCLR是什么和不是什么的一个相当全面的看法。
如果您需要命令行实用程序,那么您可以使用curl。
如果你想要一个可以处理这个问题的预制SQLCLR函数,这样你就不必担心在SQLCLR中做这样一个操作的学习曲线了,那么SQL#库中就可以找到它。我创建了(但它不在免费版本中;仅在完整/付费版本中可用)。
如果您打算在Trigger中进行此URL / Web Sevice调用(无论是SQLCLR触发器还是调用SQLCLR对象的T-SQL触发器),那么您需要非常小心,因为触发器在系统创建的事务中执行(如果没有显式事务已经存在)。这意味着事务的实际提交(即真正保存对DB的更改)将等到外部调用完成。你遇到的两个问题是:
ServicePointManager.DefaultConnectionLimit
控制,可以通过HttpWebRequest
对象访问(我认为有ServicePoint
属性)。默认限制为2,因此即使Web服务具有快速响应的能力,每秒对Web服务的调用超过1到3次(一般来说)也会导致阻塞。每秒1到3次调用可能看起来不多,但如果在多个表的审计触发器方案中使用此方法,则很容易达到此限制。因此,您需要将限制增加到远高于2的值,并且每个调用都存储在应用程序域中,有时因内存压力而被卸载。有关更多信息和注意事项,请参阅我在S.O。上的类似问题的相关答案:
SQL Server 2012 make HTTP 'GET' Request from a stored procedure
Logging not Persisting When Exception Occurs in Method Executed in a Trigger
此外,这个S.O.在想要接近DML变化的实时通知方面,问题非常相似,可能适用于您的目标: