我正在编写一些使用大量动态SQL的代码,因此,有些情况下第三方应用程序可能会或可能不会声明SQL变量。如果存在SQL变量
是否有方法来测试变量是否已被声明。 一些伪代码将是:
IF OBJECT_ID(N'@var'
) IS NOT NULL
BEGIN
DECLARE @var AS varchar(max)
END
此外,有没有一种方法来列出当前所有申报像本地观看窗口的变量?
我正在编写一些使用大量动态SQL的代码,因此,有些情况下第三方应用程序可能会或可能不会声明SQL变量。如果存在SQL变量
是否有方法来测试变量是否已被声明。 一些伪代码将是:
IF OBJECT_ID(N'@var'
) IS NOT NULL
BEGIN
DECLARE @var AS varchar(max)
END
此外,有没有一种方法来列出当前所有申报像本地观看窗口的变量?
编号
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碎片拼凑在一起很棘手。由于没有确定范围,因此无法防止一个碎片破坏整个批次。如果你可以负担任何检查,他们需要在不同的层次 - 你可能不得不改变片段中的变量名称以避免冲突。另一种选择可能是禁止第三方声明任何变量,而是要求他们从你身边注册变量 - 这将允许你选择避免冲突的名称。
对不起,迟到的回应。这是一个完美的答案。时间越流逝,我越感谢回答“否”是智慧的普遍标志。你设法很好地推断了我正在努力完成的任务,并且利用表格作为制造我自己的方法来检查存在的手段,既是口才,又是我不曾想到的。万分感谢!!! – Jsjjharp
是具有动态SQL函数或过程的代码吗?如果是这样,您可以始终为所有输入变量分配一个默认值,以防它们未提供,例如:https://technet.microsoft.com/en-us/library/ms189330(v=sql.105).aspx – Milan
虽然我我不知道有什么办法来测试一个变量是否已经被声明,在我看来,你会有两种情况:如果它不存在,那么没有问题,但如果它确实存在,那么无论你做什么,您要么必须使用不同的变量名称,要么重新分配变量,否则您的过程将会出错。在第二种情况下的任何情况下,在我看来,最好尽量避免这种情况,只需使用不寻常的约定命名变量,以免与第三方发生冲突(例如,而不是与@var,使用@__var或其他)。 – ZLK
[如何检查变量是否已经声明(T-SQL)?](https://stackoverflow.com/questions/5541210/how-to-check-if-a-variable-is-already-声明-t-sql) –