4

私のデータベースには、参照整合性の制約を確実にするために役立つ計算列がいくつかあります。私が使用しているLINQ2SQLはデータベースのデフォルト値を理解しないため、デフォルト値の列ではなく計算列を使用します。

私の試みは使用することです

CAST('C' as CHAR(1))

自動的に変換されます

(CONVERT([char](1),'C',0))

SSMSによる。ただし、これにより、NULL可能なCHAR(1)列型になります。

'C'または(NULLタイプではない)を使用するISNULL(NULL,'C')と、列はVARCHAR(?)として取得されます。そして、2つを組み合わせて使用ISNULL(NULL,CONVERT([char](1),'C',0))​​すると、NULL可能なCHAR(1)に戻ります。

これが必要な理由は2つあります。

  1. 計算された列は、外部のCHAR(1)列との関係に参加します。

  2. NULL以外のCHAR(1)は、LINQ2SQLの.NET文字タイプに直接マップされます。


アップデート:

で動作しますISNULL(CONVERT([char](1),'C',0),0)が、「なぜ」はよくわかりません。ISNULL(..,0)どちらかといえば、タイプをさらに統一できないようです。

良い説明のある答えがあれば嬉しいです。

4

1 に答える 1

2

1)SQL Serverでは、プレフィックスのない文字列リテラルは常に、文字列の長さから派生した場所Nとして扱われます。varchar(x)x

 +---------------+--------------+
| String Length |  Data Type   |
+---------------+--------------+
| 0             | varchar(1)   |
| 1-8000        | varchar(x)   |
| > 8000        | varchar(max) |
+---------------+--------------+

2)計算列に記載されているとおり

データベースエンジンは、使用される式に基づいて、計算列のnull可能性を自動的に判断します。ほとんどの式の結果は、null不可能な列のみが存在する場合でもnull可能と見なされます。...null可能な式は、を指定することでnull不可能な式に変換できますISNULL(check_expression, constant)。定数はnull結果の代わりにnull以外の値です。

3)のドキュメントISNULL ( check_expression , replacement_value )

タイプを返すcheck_expressionと同じタイプを返します。check_expressionとしてリテラルNULLが指定されている場合、replacement_valueのデータ型を返します。

これらの3つの情報は、質問のすべての動作を説明しています。

于 2013-03-23T09:22:26.267 に答える