如何检查是否声明了sql变量?

时间:2014-01-02 22:29:57

标签: sql-server tsql variables variable-declaration

在MS SQL Server中。请不要告诉我ctrl-f。我无法访问整个查询,但我正在编写依赖于是否声明某个变量的列。

感谢。

修改 我正在使用一些奇怪的查询引擎。我需要编写选择列部分,引擎将负责其余部分(希望如此)。但在某些情况下,这个引擎会声明变量(谢天谢地我会知道变量名),而在其他情况下它不会。我需要编写我的列以在声明它们时获取这些变量,并在未声明这些变量时给出默认值。

1 个答案:

答案 0 :(得分:1)

考虑到我对你正在运行的内容的理解有限(我解读单词问题意味着你的"查询引擎"实际上是一个"查询生成引擎& #34;所以,像ORM这样的东西你可以通过以下查询观察这个场景中服务器上发生了什么:

select 
    sql_handle, 
    st.text
    from sys.dm_exec_requests r 
    cross apply sys.dm_exec_sql_text(r.sql_handle) st
where session_id <> @@SPID
    and st.text like '%@<<parameter_name>>%';

声明需要已经开始执行才能捕获它。根据多种情况,您也可以从查询统计信息中提取它: 这也将为您提供查询计划(如果有的话),但请注意,它还将为自己以及上面的查询提取统计数据,因此当您查看外部和语句文本时,您需要识别它们值:

select 
    text,
    SUBSTRING(
                st.text,
                (qs.statement_start_offset / 2) + 1,
                ((CASE qs.statement_end_offset
                                    WHEN -1 THEN DATALENGTH(st.TEXT)
                        ELSE qs.statement_end_offset
                        END -
                                qs.statement_start_offset) / 2) + 1)
                    AS statement_text,
                    plan_generation_num, creation_time, last_execution_time, execution_count
                    ,total_worker_time, last_worker_time, min_worker_time, max_worker_time, 
                    total_physical_reads, min_physical_reads, max_physical_reads, last_physical_reads,
                    total_logical_writes, min_logical_writes, max_logical_writes, last_logical_writes,
                    total_logical_reads, min_logical_reads, max_logical_reads, last_logical_reads,
                    total_elapsed_time, last_elapsed_time, min_elapsed_time, max_elapsed_time, 
                    total_rows,last_rows,min_rows,max_rows
                    ,qp.*

    from sys.dm_exec_query_stats qs 
    cross apply sys.dm_exec_sql_text(qs.sql_handle) st
    outer apply sys.dm_exec_query_plan(qs.plan_handle) qp
    where st.text like '%@<<parameter_name>>%';