我正在编写一些使用大量动态SQL的代码,因此,有些情况下第三方应用程序可能会或可能不会声明SQL变量.
有没有办法测试是否已声明变量.一些伪代码将是:
IF OBJECT_ID(N'@var'
) IS NOT NULL
BEGIN
DECLARE @var AS varchar(max)
END
Run Code Online (Sandbox Code Playgroud)
此外,有没有办法列出当前声明为本地监视窗口的所有变量?
没有.
T-SQL每批次声明变量 - 它们没有任何范围.您需要确保从外部声明所有实际使用的变量 - 在批处理运行时,为时已晚.
目前还不清楚你要完成什么,以及你可以对代码片段施加什么样的约束.一种替代方法是使用除变量之外的其他东西 - 例如,将用于所有其他"伪变量"的公共表变量.像这样的东西:
declare @parameters table
(
Id varchar(20),
Value sql_variant
);
-- This is the code generated by the 3rd party; update might be better than insert
insert into @parameters values ('MyVar', 42);
-- Using the variable - you get NULL or the actual value
declare @MyVar int;
select @MyVar = cast(Value as int) from @parameters where Id = 'MyVar';
Run Code Online (Sandbox Code Playgroud)
然后,所有变量都由您的部分代码声明(或根本不声明),第三方只能选择从默认值中更改它们.当然,这对于您的用例可能完全没用 - 目前尚不清楚您实际期望发生什么样的场景.
通常,将T-SQL片段拼凑在一起很棘手.由于没有范围界定,因此无法阻止一个片段破坏整个批次.如果您可以负担任何检查,则它们需要位于不同的层上 - 您可能必须更改片段中变量的名称以避免冲突.另一种选择可能是禁止第三方声明任何变量,而是要求他们从您身边注册一个变量 - 这将允许您选择避免冲突的名称.