60

(とりわけ) 新しい SQL Server データベースを作成するツールをクライアントに提供する予定であり、クライアントが提供するデータベース名に対して基本的な検証を実行できるようにしたいと考えています。SQL Server のドキュメントでは、データベース名で有効な文字について説明しています。ただし、文書化された規則に違反する名前のデータベースを正常に作成できるため、文書化は明らかに間違っています。

CREATE DATABASEに関する SQL Server のドキュメントによると、データベース名は識別子の規則に従う必要があります。識別子のルールは、データベースの互換性レベルによって異なります。_互換性レベルが 100 (SQL Server Management Studio によれば、"SQL Server 2008" を意味します) の場合、名前は Unicode 文字、、、@または#;で始まる必要があります。その後に1 つ以上@の文字、数字、、、、、または が続きます。ドキュメントには、スペースや特殊文字の埋め込みは許可されていないと明記されています。$#_

SQL Server Management Studio を使用して、This & That | "Other"埋め込みスペース (明示的に禁止されている) だけでなく、特殊文字 ( |, ") を含む名前のデータベースを作成できるため、これは利用可能な証拠に反していますファイル名で有効です。確認したところ、データベースの互換性レベルは実際には「SQL Server 2008 (100)」ですが、その名前はその互換性レベルでは無効であると文書化されています。

なんと、最初の文字が文字、アンダースコア、アットマーク、またはポンド記号である必要がないCREATE DATABASE " "ことを証明することもできます (はい、それは単一のスペースです) 。

私の質問は、SQL Server データベース名で有効な文字は何ですか? SQL Server の実際の動作と一致する文書化されたルールはありますか?

4

4 に答える 4

31

識別子の規則は最後に次のように述べています。

Transact-SQL ステートメントで識別子を使用する場合、これらの規則に準拠していない識別子は、二重引用符または角かっこで区切る必要があります。

これらの規則に準拠しないデータベース名を選択すると、常に二重引用符または大括弧で囲む必要があります。

通常の識別子の規則が守られている場合は、引用符/括弧なしでデータベース名を使用できます。

次の指示は大丈夫です

CREATE DATABASE [conformingName]
CREATE DATABASE conformingName
CREATE DATABASE [This & That | "Other"]

だがしかし

CREATE DATABASE This & That | "Other"

編集:

これは、リンクされたドキュメントを理解する方法ではないことに同意します。識別子が囲まれるとすぐにルールが適用されなくなる場合、識別子のルールに準拠する必要があるとはどういう意味ですか? 非準拠の識別子を囲むことについてのポイントは、ルールの一部である必要があります。

于 2010-11-17T00:33:10.390 に答える
11

通常の識別子と区切り識別子には違いがあります。通常の識別子は、言及した制限によって拘束されますが、区切り識別子には任意の文字を含めることができます (区切り文字を除く)。

識別子の周りに引用符を使用しているため、これは区切り識別子であり、通常の識別子の規則に制限されません。

区切り文字がないと、通常の識別子のルールに従う識別子を持つデータベースのみを作成できます。

create database db_name

区切り記号を使用すると、ほとんど何でも使用できます。

create database "That's a funny name, isn't it?"

create database [)(/%Q)/#&%¤)Q/#)!]
于 2010-11-17T00:40:36.623 に答える
7

個人的には、アルファベットと数字だけに制限します (おそらく_も)。スペース、おかしな記号、キャリッジ リターンなどは使用しないでください。これが最も安全な方法です。

于 2010-11-17T15:23:02.440 に答える