使用 SQL Server 2012 打开 URL
open a URL with SQL Server 2012
我正在尝试通过 SQL Server 2012 打开 Web URL,我们已经尝试 SQLCLR 但它已经过时了,我们尝试 运行 一个批处理文件它会卡在执行过程中
EXEC xp_cmdshell 'c:\PATH.bat'
这是我们用来打开批处理文件的代码,然后它卡在执行查询中,我等了 5 分钟仍然没有弹出任何内容
我们已经检查了文件权限,一切都被允许了,这是我第 4 次尝试这样做,但我无法解决,有人可以告诉我一个替代解决方案吗?
虽然从 SQL 服务器内部访问 URL 有利也有弊,但 SQLCLR 绝对不会 过时。即使您没有自定义程序集,它仍然在内部用于几件事:
- 层次结构、几何、地理数据类型
- 复制
FORMAT
、TRY_PARSE
等几个内置函数
- 等等
有关 SQLCLR 实际是什么以及可以做什么的更多信息,请参阅我在 SQL Server Central 上就此主题撰写的系列文章:Stairway to SQLCLR(免费需要注册才能阅读该网站上的内容,但这是值得的 :-)。级别 1 ("What is SQLCLR?") 相当全面地介绍了 SQLCLR 是什么和不是什么。
如果您想要命令行实用程序,那么您可以使用 curl.
如果您想要一个可以处理此问题的预制 SQLCLR 函数,这样您就不必担心在 SQLCLR 中执行此类操作的学习曲线,那么在我创建的 SQL# 库中可用(但它不在免费版本中;仅在完整/付费版本中可用)。
如果您要从触发器中进行此 URL / Web 服务调用(无论是 SQLCLR 触发器还是 T-SQL 触发器调用 SQLCLR 对象),那么您需要 非常 小心,因为触发器在系统创建的事务中执行(如果不存在显式事务)。这意味着事务的实际提交(即真正将更改保存到数据库)将等到外部调用完成。您 运行 遇到的两个问题是:
- Web 服务响应速度不快(它需要响应速度超级)
- 对特定 URI 发出的并发请求较多,因此 .NET 会等待直到有空位。这是由
ServicePointManager.DefaultConnectionLimit
控制的,可以通过 HttpWebRequest
对象访问(我认为有一个 ServicePoint
属性)。默认限制为 2,因此每秒对 Web 服务的调用超过 1 - 3 次(一般而言)会导致阻塞,即使 Web 服务具有快速响应的能力。每秒 1 - 3 次调用可能看起来并不多,但如果在多个表的审计触发器场景中使用此方法,则很容易达到此限制。因此,您需要将限制增加到远高于 2 的值,并且每次调用都存储在应用程序域中,有时由于内存压力而被卸载。
有关更多信息和注意事项,请在 S.O 上查看我对类似问题的相关回答。:
SQL CLR awaitable not getting executed
还有这个S.O。就想要接近实时的 DML 更改通知而言,问题非常相似,可能适用于您的目标:
我正在尝试通过 SQL Server 2012 打开 Web URL,我们已经尝试 SQLCLR 但它已经过时了,我们尝试 运行 一个批处理文件它会卡在执行过程中
EXEC xp_cmdshell 'c:\PATH.bat'
这是我们用来打开批处理文件的代码,然后它卡在执行查询中,我等了 5 分钟仍然没有弹出任何内容
我们已经检查了文件权限,一切都被允许了,这是我第 4 次尝试这样做,但我无法解决,有人可以告诉我一个替代解决方案吗?
虽然从 SQL 服务器内部访问 URL 有利也有弊,但 SQLCLR 绝对不会 过时。即使您没有自定义程序集,它仍然在内部用于几件事:
- 层次结构、几何、地理数据类型
- 复制
FORMAT
、TRY_PARSE
等几个内置函数- 等等
有关 SQLCLR 实际是什么以及可以做什么的更多信息,请参阅我在 SQL Server Central 上就此主题撰写的系列文章:Stairway to SQLCLR(免费需要注册才能阅读该网站上的内容,但这是值得的 :-)。级别 1 ("What is SQLCLR?") 相当全面地介绍了 SQLCLR 是什么和不是什么。
如果您想要命令行实用程序,那么您可以使用 curl.
如果您想要一个可以处理此问题的预制 SQLCLR 函数,这样您就不必担心在 SQLCLR 中执行此类操作的学习曲线,那么在我创建的 SQL# 库中可用(但它不在免费版本中;仅在完整/付费版本中可用)。
如果您要从触发器中进行此 URL / Web 服务调用(无论是 SQLCLR 触发器还是 T-SQL 触发器调用 SQLCLR 对象),那么您需要 非常 小心,因为触发器在系统创建的事务中执行(如果不存在显式事务)。这意味着事务的实际提交(即真正将更改保存到数据库)将等到外部调用完成。您 运行 遇到的两个问题是:
- Web 服务响应速度不快(它需要响应速度超级)
- 对特定 URI 发出的并发请求较多,因此 .NET 会等待直到有空位。这是由
ServicePointManager.DefaultConnectionLimit
控制的,可以通过HttpWebRequest
对象访问(我认为有一个ServicePoint
属性)。默认限制为 2,因此每秒对 Web 服务的调用超过 1 - 3 次(一般而言)会导致阻塞,即使 Web 服务具有快速响应的能力。每秒 1 - 3 次调用可能看起来并不多,但如果在多个表的审计触发器场景中使用此方法,则很容易达到此限制。因此,您需要将限制增加到远高于 2 的值,并且每次调用都存储在应用程序域中,有时由于内存压力而被卸载。
有关更多信息和注意事项,请在 S.O 上查看我对类似问题的相关回答。:
SQL CLR awaitable not getting executed
还有这个S.O。就想要接近实时的 DML 更改通知而言,问题非常相似,可能适用于您的目标: