2017-06-29 28 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

変数がすでに宣言されているかどうかをテストする方法は知らないので、2つのシナリオがあるように思えます。存在しない場合は問題はありませんが、存在する場合は、別の変数名を使用する必要があるか、変数を再割り当てするか、プロシージャーにエラーが発生します。そして、第2のシナリオのいずれの状況においても、@ varの代わりに、第三者と競合しないように、例外的な規約で変数を命名するだけで、 @ __varなどを使用してください)。 – ZLK

+2

[変数が既に宣言されているかどうかを確認する方法(T-SQL)?](https://stackoverflow.com/questions/5541210/how-to-check-if-a-variable-is-already- declared-t-sql) –

答えて

2

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つの選択肢は、第三者が変数を宣言することを禁止し、代りに変数を登録することです。衝突を避ける名前を選択することができます。

+0

遅れて返事をして申し訳ありません。これは完璧な答えです。より多くの時間が経過すると、「いいえ」と答えることが知恵の普遍的な兆候であることに感謝する。あなたは私が達成しようとしていたものをかなり外挿することができました。そして、テーブルを活用して存在を確認する私の独自の方法を雄弁にする方法と、ありがとう、トン! – Jsjjharp

関連する問題