2017-06-29 98 views
2

我正在编写一些使用大量动态SQL的代码,因此,有些情况下第三方应用程序可能会或可能不会声明SQL变量。如果存在SQL变量

是否有方法来测试变量是否已被声明。 一些伪代码将是:

IF OBJECT_ID(N'@var' 
) IS NOT NULL 
BEGIN 
    DECLARE @var AS varchar(max) 
END 

此外,有没有一种方法来列出当前所有申报像本地观看窗口的变量?

+0

是具有动态SQL函数或过程的代码吗?如果是这样,您可以始终为所有输入变量分配一个默认值,以防它们未提供,例如:https://technet.microsoft.com/en-us/library/ms189330(v=sql.105).aspx – Milan

+1

虽然我我不知道有什么办法来测试一个变量是否已经被声明,在我看来,你会有两种情况:如果它不存在,那么没有问题,但如果它确实存在,那么无论你做什么,您要么必须使用不同的变量名称,要么重新分配变量,否则您的过程将会出错。在第二种情况下的任何情况下,在我看来,最好尽量避免这种情况,只需使用不寻常的约定命名变量,以免与第三方发生冲突(例如,而不是与@var,使用@__var或其他)。 – ZLK

+2

[如何检查变量是否已经声明(T-SQL)?](https://stackoverflow.com/questions/5541210/how-to-check-if-a-variable-is-already-声明-t-sql) –

回答

2

编号

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'; 

所有的变量,然后由你的代码(或者根本没有)的一部分宣布,与第三方只有一个选项,他们从默认值改变。当然,这可能对你的用例完全没用 - 目前还不清楚你实际期望发生什么类型的场景。

一般来说,将T-SQL碎片拼凑在一起很棘手。由于没有确定范围,因此无法防止一个碎片破坏整个批次。如果你可以负担任何检查,他们需要在不同的层次 - 你可能不得不改变片段中的变量名称以避免冲突。另一种选择可能是禁止第三方声明任何变量,而是要求他们从你身边注册变量 - 这将允许你选择避免冲突的名称。

+0

对不起,迟到的回应。这是一个完美的答案。时间越流逝,我越感谢回答“否”是智慧的普遍标志。你设法很好地推断了我正在努力完成的任务,并且利用表格作为制造我自己的方法来检查存在的手段,既是口才,又是我不曾想到的。万分感谢!!! – Jsjjharp