【问题标题】:SQL Server Management Studio Activity Monitor: What is the unexpected "SQL" at the top of the 'Last Transact-SQL command batch"SQL Server Management Studio 活动监视器:“最后一个 Transact-SQL 命令批处理”顶部的意外“SQL”是什么
【发布时间】:2018-09-09 16:58:30
【问题描述】:

我的 C# 程序将多个 SELECT 查询提交到远程服务器上的 SQL Server 实例。我正在尝试使用远程服务器上的 SQL Server Mgmt Studio 活动监视器来跟踪查询问题。屏幕截图中的文本取自Last Transact-SQL command batch 对话框,当我在活动监视器中右键单击代表我失败的 SQL 查询的进程时出现该对话框(该查询导致服务器停止响应)。

我的问题是:窗口顶部的文字(@SearchString nvarchar(8)) 出乎意料。它从哪里来的? @SearchString 是我在程序中用于 SQL 参数的 C# 变量的名称,但我从程序中编写和发送的 SELECT 语句没有明确包含 (@SearchString nvarchar(8)),如活动监视器中所示。我的 SQL Server 实例是否出于某种原因将其插入远程服务器端?

附言我认为尝试将 VARBINARY contentData 列转换为 NVARCHAR 可能导致我的查询挂起

【问题讨论】:

  • 该工具可能会添加它以帮助运行以下查询。 @SearchString 是查询中使用的变量,因此该工具只是使用参数化查询语法为您声明它。
  • @DanWilson 好吧,该死 - 这很有道理!我不是从服务器的角度考虑的。请把它变成一个答案

标签: c# sql-server ssms


【解决方案1】:

进程正在运行参数化查询。使用活动监视器查看进程查询时,任何参数都使用参数化查询语法声明,即(@SearchString nvarchar(8))

这有利于 1) 查看查询时的信息,以及 2) 如果您想在应用程序之外运行查询。

可以使用sys.dm_exec_sql_text() 表值函数并传递连接的SQL 句柄来找到该脚本。

下面是一个近似于活动监控工具中找到的数据的查询。来源:Google web cache

SELECT 
   SessionId    = s.session_id, 
   UserProcess  = CONVERT(CHAR(1), s.is_user_process),
   LoginInfo    = s.login_name,   
   DbInstance   = ISNULL(db_name(r.database_id), N''), 
   TaskState    = ISNULL(t.task_state, N''), 
   Command      = ISNULL(r.command, N''), 
   App            = ISNULL(s.program_name, N''), 
   WaitTime_ms  = ISNULL(w.wait_duration_ms, 0),
   WaitType     = ISNULL(w.wait_type, N''),
   WaitResource = ISNULL(w.resource_description, N''), 
   BlockBy        = ISNULL(CONVERT (varchar, w.blocking_session_id), ''),
   HeadBlocker  = 
        CASE 
            -- session has active request; is blocked; blocking others
            WHEN r2.session_id IS NOT NULL AND r.blocking_session_id = 0 THEN '1' 
            -- session idle; has an open tran; blocking others
            WHEN r.session_id IS NULL THEN '1' 
            ELSE ''
        END, 
   TotalCPU_ms        = s.cpu_time, 
   TotalPhyIO_mb    = (s.reads + s.writes) * 8 / 1024, 
   MemUsage_kb        = s.memory_usage * 8192 / 1024, 
   OpenTrans        = ISNULL(r.open_transaction_count,0), 
   LoginTime        = s.login_time, 
   LastReqStartTime = s.last_request_start_time,
   HostName            = ISNULL(s.host_name, N''),
   NetworkAddr        = ISNULL(c.client_net_address, N''), 
   ExecContext        = ISNULL(t.exec_context_id, 0),
   ReqId            = ISNULL(r.request_id, 0),
   WorkLoadGrp        = N'',
   LastCommandBatch = (select text from sys.dm_exec_sql_text(c.most_recent_sql_handle)) 
FROM sys.dm_exec_sessions s LEFT OUTER JOIN sys.dm_exec_connections c ON (s.session_id = c.session_id)
LEFT OUTER JOIN sys.dm_exec_requests r ON (s.session_id = r.session_id)
LEFT OUTER JOIN sys.dm_os_tasks t ON (r.session_id = t.session_id AND r.request_id = t.request_id)
LEFT OUTER JOIN 
(
    -- Using row_number to select longest wait for each thread, 
    -- should be representative of other wait relationships if thread has multiple involvements. 
    SELECT *, ROW_NUMBER() OVER (PARTITION BY waiting_task_address ORDER BY wait_duration_ms DESC) AS row_num
    FROM sys.dm_os_waiting_tasks 
) w ON (t.task_address = w.waiting_task_address) AND w.row_num = 1
LEFT OUTER JOIN sys.dm_exec_requests r2 ON (r.session_id = r2.blocking_session_id)
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) as st

WHERE s.session_Id > 50                         -- ignore anything pertaining to the system spids.

AND s.session_Id NOT IN (@@SPID)     -- let's avoid our own query! :)

【讨论】:

    猜你喜欢
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    相关资源
    最近更新 更多