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

Sql server 如何检查是否声明了sql变量?,sql-server,tsql,variables,variable-declaration,Sql Server,Tsql,Variables,Variable Declaration,在MS SQL Server中。请不要告诉我按ctrl-f键。我没有访问整个查询的权限,但我正在根据是否声明了某个变量来组合列 谢谢 编辑: 我正在使用一些奇怪的查询引擎。我需要编写selectcolumns部分,引擎将处理其余部分(希望如此)。但在某些情况下,这个引擎会声明变量(谢天谢地,我知道变量名),而在其他情况下则不会。我需要组合我的列,以便在声明这些变量时获取它们,并在未声明这些变量时提供默认值 鉴于我对您正在运行的内容理解的局限性(我将“问题”一词解读为您的“查询引擎”实际上是一个“

在MS SQL Server中。请不要告诉我按ctrl-f键。我没有访问整个查询的权限,但我正在根据是否声明了某个变量来组合列

谢谢

编辑:
我正在使用一些奇怪的查询引擎。我需要编写selectcolumns部分,引擎将处理其余部分(希望如此)。但在某些情况下,这个引擎会声明变量(谢天谢地,我知道变量名),而在其他情况下则不会。我需要组合我的列,以便在声明这些变量时获取它们,并在未声明这些变量时提供默认值

鉴于我对您正在运行的内容理解的局限性(我将“问题”一词解读为您的“查询引擎”实际上是一个“查询生成引擎”,因此类似于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>>%';
选择
sql_句柄,
圣文
从sys.dm_exec_请求r
交叉应用sys.dm_exec_sql_text(r.sql_handle)st
何处会话\u id@@SPID
和st.text,如“@%”;
语句需要已经开始执行才能捕获它。根据多种情况,您也可以从查询统计数据中提取它: 这也将获得查询计划(如果有),但请注意,它还将为自身以及上面的查询提取统计信息,因此在查看外部和语句文本值时,您需要辨别:

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>>%';
选择
文本,
子串(
圣文本,
(qs.statement\u start\u offset/2)+1,
((案例qs.statement_end_offset)
当-1时,则为数据长度(st.TEXT)
其他qs.statement\u end\u offset
结束-
qs.报表_开始_偏移)/2)+1)
作为声明文本,
计划生成数量、创建时间、上次执行时间、执行次数
,总工时,最后工时,最小工时,最大工时,
总物理读数、最小物理读数、最大物理读数、最后物理读数、,
总逻辑写入、最小逻辑写入、最大逻辑写入、最后逻辑写入、,
总逻辑读取、最小逻辑读取、最大逻辑读取、最后一次逻辑读取,
总已用时间、上次已用时间、最小已用时间、最大已用时间、,
总计行、最后行、最小行、最大行
,qp*
从sys.dm_exec_query_stats qs
交叉应用sys.dm_exec_sql_text(qs.sql_handle)st
外部应用系统dm执行查询计划(qs计划句柄)qp
其中st.text类似“@%”;

您不能在脚本中有条件地声明变量,因此我不明白您在这里要做什么。您的要求没有意义。您是否正在尝试对没有源代码的存储过程、触发器或函数进行反向工程?视图没有变量。我建议你向你的管理员询问T-SQL。发布一些代码将是helpfull@addy2601是的。。这是我最不想做的事。但似乎没有更好的解决办法。编辑:哎哟,连try/catch都不行。@addy2601:“不是一件好事”不是问题所在。问题是,正如OP已经发现的那样,它不会产生任何效果。带有无效变量引用的脚本无法运行,try/catch块无法捕获错误。