sys.dm_exec_sql_text如何工作?

sys.dm_exec_sql_text如何工作?,sql,sql-server-2012,Sql,Sql Server 2012,你能解释一下原因吗 从sys.dm\u exec\u sql\u文本(sql\u句柄)中选择* 引发错误(列名“sql\U句柄”无效),但 select*from sys.sysprocesss交叉应用sys.dm\u exec\u sql\u text(sql\u句柄)是否为有效查询? 谢谢。您需要将其连接到另一个表以获取sql\u句柄(或计划\u句柄) 例如: select a.session_id, a.start_time, status, a.command, text from sy

你能解释一下原因吗

从sys.dm\u exec\u sql\u文本(sql\u句柄)中选择*
引发错误(列名“sql\U句柄”无效),但

select*from sys.sysprocesss交叉应用sys.dm\u exec\u sql\u text(sql\u句柄)
是否为有效查询?
谢谢。

您需要将其连接到另一个表以获取sql\u句柄(或计划\u句柄)

例如:

select a.session_id, a.start_time, status, a.command, text from sys.dm_exec_requests a cross apply sys.dm_exec_sql_text(sql_handle).

sys.dm_exec_sql_text
是一个表值函数,它希望将参数
sql_handle
plan_handle
传递给它,以便像其他函数一样返回结果。返回的结果是一个表(而不是一个将返回单个值的标量函数)。

因为
sql\u handle
是中的列的名称?谢谢,Damien。但是这个专栏的意义是什么呢?我如何单独测试这个函数(dm_exec_sql_text),还是我们总是需要将它与另一个表结合使用?谢谢Simon!为了更好地理解,我想问:
从sys.sysprocesss中选择不同的sql\u句柄
——这会给出许多sql\u句柄,表示“当前正在执行的批或对象”。但是,如果我这样做:
select*from sys.dm_exec_sql_text(convert(binary,'0x010001000B84CH15904B3300000000000000')
,它会抛出“传递给dm_exec_sql_text的句柄无效”。为什么?(我试图单独使用sys.dm_exec_sql_text来更好地理解它)@Anne-这很可能是类型转换问题<代码>从sys.dm_exec_sql_文本中选择*(转换(二进制,'0x010001000B84CH15904B3300000000000000'‌​, 1) )。默认样式为0(ascii转换)。对于字符表达式,添加“1”。请参见旁注。sysprocesses是一个弃用的2000系统表,它仅用于向后兼容,将在将来的版本中删除。从2005年起,我们将了解
sys.dm_exec_连接
sys.dm_exec_会话
sys.dm_exec_请求
dmv。再见,非常感谢西蒙!不幸的是,即使使用sys.dm_exec_sql_text(convert(二进制,'0x010001000B84CH15904B3300000000000000')中的
select*,我仍然会收到一个错误‌​‌​, 1) )
:“传递给dm_exec_sql_text的句柄无效。”对此有什么想法吗?@Anne-这行吗?我认为二进制是无效的,它有一个H。我根本不需要做任何转换<代码>从sys.dm_exec_sql_文本(0x030005002D57016E1D8E1D00C8A100000000)中选择*。我必须使用1,如果我像你一样将它包装在转换中。