号
T-SQLごとのバッチの変数を宣言します - 彼らはすべてのスコープを持っていません。実際に使用されているすべての変数が外部から宣言されていることを確認する必要があります。バッチが実行されるまでには、それは遅すぎます。
あなたが達成しようとしていることは明確ではなく、コードフラグメントにどのような制約を課すことができますか。 1つの代替策は、変数以外のものを使用することです。たとえば、他のすべての「疑似変数」に使用される共通の表変数などです。このような何か:
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の断片を叩くことは難しいです。スコーピングがないので、1つのフラグメントがバッチ全体を破壊するのを防ぐ方法はありません。チェックが必要な場合は、別のレイヤーにする必要があります。衝突を避けるために、フラグメント内の変数の名前を変更する必要があるかもしれません。もう1つの選択肢は、第三者が変数を宣言することを禁止し、代りに変数を登録することです。衝突を避ける名前を選択することができます。
は、動的SQL関数またはプロシージャのコードですか?そうであれば、すべての入力変数にデフォルト値を割り当てることができます。つまり、入力変数が提供されていない場合です。https://technet.microsoft.com/en-us/library/ms189330(v=sql.105).aspx – Milan
変数がすでに宣言されているかどうかをテストする方法は知らないので、2つのシナリオがあるように思えます。存在しない場合は問題はありませんが、存在する場合は、別の変数名を使用する必要があるか、変数を再割り当てするか、プロシージャーにエラーが発生します。そして、第2のシナリオのいずれの状況においても、@ varの代わりに、第三者と競合しないように、例外的な規約で変数を命名するだけで、 @ __varなどを使用してください)。 – ZLK
[変数が既に宣言されているかどうかを確認する方法(T-SQL)?](https://stackoverflow.com/questions/5541210/how-to-check-if-a-variable-is-already- declared-t-sql) –