【问题标题】:CLR Procedure Not list in processes SQL ServerCLR 过程未在进程 SQL Server 中列出
【发布时间】:2017-11-06 07:50:16
【问题描述】:

我创建了一个 CLR 程序来下载电子邮件文件。它运行良好,当我查询服务器进程时没有列出它运行时的问题。

有人知道在 sql server 进程中获取它的方法吗?

我正在使用下面的查询

exec dbo.sp_download_files_mail

【问题讨论】:

  • 您使用什么查询来检查 SQL Server 进程?请在问题中发布。谢谢。
  • 请发布您正在使用的查询以检查正在运行的内容。谢谢。

标签: sql sql-server visual-studio sqlclr


【解决方案1】:

如果您希望通过sys.dm_exec_requests.plan_handlesys.dm_exec_sql_text 中看到exec dbo.sp_download_files_mail,那么这可能不会发生。当您使用EXEC 时,它会创建一个可能是不同执行计划的子流程。在 SQLCLR 的情况下,除非您使用 SqlConnection 执行 T-SQL,否则 SQL Server 无法洞察正在发生的事情,然后您将获得在 SQLCLR 对象中执行的 SQL 的计划,而不是 SQLCLR 的计划对象本身。当你没有执行任何T-SQL语句时,sql_handleplan_handle值为空: 0x000000000000/300000000/3000000//dr>

但是,您可以看到 SQLCLR 对象显示在从 sys.dm_exec_cached_plans 返回的 plan_handle 值中。 SQLCLR 对象在执行时似乎确实出现在此 DMV 中,但由于此 DMV 报告缓存的对象,它不一定会在 SQLCLR 对象完成后被删除。因此,您不能使用此 DMV 来指示对象的当前运行状态。 sys.dm_exec_cached_plans 中报告的 plan_handle 值也不会在运行时显示在 sys.dm_exec_requests 中。

您可以自己测试此行为,方法是创建一个 SQLCLR 存储过程或 SQLCLR 标量用户定义函数,它只会调用 System.Threading.Thread.Sleep() 至少 30 秒。如果您不想创建这个,一个预制的 SQLCLR UDF - DB_WaitForDelay - 存在于SQL# SQLCLR 库(我创建的)的免费版本中,并且是我在下面的示例代码。

在 SQL Server Management Studio (SSMS) 中,打开两个查询选项卡并粘贴以下内容:

标签 1

EXEC [SQL#].[DB_WaitForDelay] 30000, 1;

标签 2

SELECT txt.*, req.*
FROM sys.dm_exec_requests req
OUTER APPLY sys.dm_exec_sql_text(req.[plan_handle]) txt
WHERE req.[session_id] = <session_id_of_Tab1>;

DBCC INPUTBUFFER(<session_id_of_Tab1>);

SELECT txt.*, cp.*
FROM sys.dm_exec_cached_plans cp
OUTER APPLY sys.dm_exec_sql_text(cp.[plan_handle]) txt
WHERE cp.[cacheobjtype] LIKE N'CLR%';

Tab 2 查询中替换“&lt;session_id_of_Tab1&gt;”的两个实例后,执行 Tab 1 查询,然后返回 Tab 2 并执行这批查询。


如果您确实需要知道此 SQLCLR 对象是否在执行时在执行时,那么您将不得不按照使用SqlConnectionContext Connection = true; 的ConnectionString 和然后执行(在 SQLCLR 对象的开头)类似SET CONTEXT_INFO 0x1234; 的内容(假设您尚未将CONTEXT_INFO 用于其他内容)。在 SQLCLR 对象的末尾,为SET CONTEXT_INFO 0x00; 执行第二个SqlCommand 以将其清除。

这种方法允许您使用以下查询来确认它当前正在运行:

SELECT req.*
FROM   sys.dm_exec_requests req
WHERE  req.[context_info] = 0x1234;

此外,在存储过程名称前加上 sp_ 是一种相当糟糕的做法,因为这会导致 SQL Server 首先检查 [master] 的对象,然后然后检查当前数据库。使用spDownloadEmailFiles 之类的东西会更好,尽管仍然没有真正好的理由为存储过程/函数/表/视图名称添加任何前缀。

【讨论】:

    猜你喜欢
    • 2021-07-16
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2016-04-14
    • 2017-08-22
    • 2011-06-01
    相关资源
    最近更新 更多