2009-04-22 11 views
3

.NETプロジェクトでは、文字列が有効なMicrosoft SQL Server 2005パラメータ識別子であるかどうかを確認する必要があります。.NETまたは正規表現でMSSQL識別子(パラメータ)を検証する

例:SELECT * FROM table WHERE column = @parameter

パラメータであるため、文字列を検証するためのランタイムクラスのメソッドがあり、またはルールを確認する正規表現がありますか?(下記参照)

From the documentation on identifiersは、パラメータはこれらの一般的な識別子の規則に従わなければならない:Unicode標準3.2によって定義さ よう*手紙:

  1. 最初の文字は、次のいずれかでなければなりません。 文字のUnicode定義には、aからzまでの ラテン文字、AからZまでの 、および他の言語の文字 文字が含まれています。 * アンダースコア(_)、アットマーク(@)、または の番号記号(#)。
    特定のシンボル は、識別子の先頭に という特別な意味を持っています。 A で始まる通常の識別子アットマークは常にローカルの 変数またはパラメータを表し、その他のタイプの オブジェクトの名前には を使用できません。数字が で始まる識別子は、一時的な 表またはプロシージャーを示します。 が二重番号記号(##)で始まる識別子 は、グローバルな一時オブジェクトを示します。 他のタイプの オブジェクトの名前を始めるには、番号記号または の数字記号を使用して の名前を使用することはできますが、この の練習はおすすめしません。いくつかのTransact-SQL関数 は、doubleで始まる名前( 記号(@@)を持ちます。 これらの関数との混乱を避けるため、@@で始まる名前を に使用しないでください。
  2. 次の文字には、次の文字を含めることができます。*定義された文字 Unicode Standard 3.2。 * ベーシック ラテン文字またはその他の国語スクリプトの小数。 * アットマーク、ドル記号($)、数字 記号、またはアンダースコア。
  3. 識別子はTransact-SQL予約語であってはなりません。 SQL Server は、予約語の大文字と小文字の両方を予約します( )。
  4. 埋め込みスペースまたは特殊文字は使用できません。
  5. 補助文字は使用できません。
  6. 識別子が のTransact-SQLステートメントで使用されている

は、 これらの規則に準拠していない 識別子は 二重引用符または括弧で区切らなければなりません。

私はパラメータのみを検証したいので、識別子は@記号で始まらなければならず、区切られてはいけません。

+0

いくつかのアプリケーションからSQLを解析しようとしていますか、それとも後でSQL文を実行しますか? – gbn

答えて

6

私はUnicode文字クラスを探していましたが、.NET正規表現でサポートされていた次の定期的に私の質問を解決するための式:

@[\p{L}{\p{Nd}}$#_][\p{L}{\p{Nd}}@$#_]*

これは強制:

  • 識別子は常にパラメータ作り、@から始まります。
  • @の2番目の位置には、特別なTSQL関数との混乱を避けることができます。
  • ルールで定義されている文字のみを許可します。
+0

+1ですが、この正規表現では@@識別子がサポートされていないことを指摘したいと思います。 @BartVerkoeijenは彼の推論を指摘しましたが、特殊なTSQL関数と混同されるかもしれませんが、実際には有効な識別子であることは明らかです。仕様に正確に適合する正規表現は '@ [\ p {L} \ p {Nd} @ $#_] +' – LunicLynx

0

私は、TSQLの正規表現を評価するための関数を作成については、この記事を見つけた内部VBScriptを使用して、here

あなたが便利見つけることができる別のリンクを、それをチェックアウトし、私はそれが登録を必要だと思い、here

別の考え方は、sysnameデータ型として@parameterを扱うことができます。ここに収まるかどうかわからない

+0

あなたのご意見ありがとうございますが、私はクライアント側(この場合はASP.NET)のルールをチェックし、サーバー側はチェックしません。私がこの部分について不明な点があれば、残念です。 –

関連する問題