【问题标题】:Powershell in SQLCLR?SQLCLR中的Powershell?
【发布时间】:2011-07-06 16:50:03
【问题描述】:

过去,我能够在 SQLCLR 中嵌入 sripting 语言(如 JScript),因此脚本可以作为函数的参数传递,以执行某些计算。这是一个简单的示例(函数 ssScriptExecute 返回脚本中所有打印的串联):

select dbo.ssScriptExecute( 'print("Calculation: "+(1+2/3) );' )

-- Calculation: 1.6666666666666665

我希望能够以同样的方式嵌入 Powershell 运行时。但是我遇到了各种各样的问题,因为运行时尝试按路径查找程序集,并且 SQlCLR 内没有路径。我很高兴提供有关我得到的错误的更多信息,但我想知道是否有人尝试过这个!

谢谢!

【问题讨论】:

    标签: powershell sqlclr


    【解决方案1】:

    我使用 il 代码注入来修改 System.Automation.Management。 使 GetPSVersionTable() 中的变量版本为“2.0” 然后我可以在 SQL Server 中运行 Powershell 代码。

    请务必在您的 Visual Studio 项目中引用此修改后的 dll。

    http://www.box.net/shared/57122v6erv9ss3aopq7p

    顺便说一句,通过在 SQL 中运行 powershell 自动注册您需要的所有 dll

    你可以使用这个 ps1 代码

    http://www.box.net/shared/tdlpu1875clsu8azxq4b

    【讨论】:

    • PSHost 主机 = 新 PoShSQL.PoShSQLHost(); RunspaceConfiguration config = new PoShSQL.PoShSQLConfig();运行空间 runspace = RunspaceFactory.CreateRunspace(host, config);
    • 说真的?...那太棒了!我会检查我是否可以尽快完成这项工作。谢谢。为黑客 +1。
    • 但是……你需要自己新建一个配置……甚至不能使用“get-date”>
    • 如果我可以问,你是如何修改 System.Management.Automation.dll 的。
    • 注入 il 代码并用强名称将其退出使用另一个密钥文件,所以...它可能与本机 Microsoft.PowerShell 系列 dll 不兼容... orz
    【解决方案2】:

    我认为这样做的唯一方法是创建一个托管 powershell 的 WCF 服务,并让 SQLCLR 将请求 dbo.ssScriptExecute(...) 发送到该服务以执行。 除此之外,我还成功地将 paxScript.net 嵌入到 SQLCLR(一个没有 DLR 语言的内存泄漏问题的解释器)中。

    【讨论】:

      【解决方案3】:

      我认为 SQLCLR 仅限于一组特定的程序集,而 PS 自动化不是其中之一。

      【讨论】:

      • 没错。但仅限限制意味着不支持。您仍然可以注册不在其批准列表中的程序集。
      • 啊,我没想到。我研究了创建 PowerShell CLR,注意到 System.Management.Automation 不是受祝福的程序集之一并停止了。如果你能让它工作起来会很有趣。
      • 我在嵌入 JScript(或任何基于 DLR 的脚本语言)中发现的一个问题是无法卸载从脚本创建的临时程序集......这是一个泄漏(每次你运行ssScriptExecute 一个新的程序集被加载到内存中,并且它仍然存在).. uff
      猜你喜欢
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      相关资源
      最近更新 更多