13

Actionこのステートメントを使用すると、列がnull許容ではないことに気づきました。

SELECT TOP 0 SerialNumber, 0 [Action] INTO #MyTable FROM FSE_SerialNumber

しかし、このステートメントを使用すると、Action列はnull許容になります。

SELECT TOP 0 SerialNumber, CAST(0 as int) [Action] INTO #MyTable FROM FSE_SerialNumber

この方法でテーブルを作成する理由は、一時テーブルがサーバーのデフォルトの照合または他の場所からSerialNumberの照合を継承することを望まないためです。FSE_SerialNumber..SerialNumberの照合と一致させたい。

私の質問は、null許容列を提供するキャスト関数に依存できるか、またはこれが明確に定義されておらず、変更される可能性があるかどうかです。キャストによって列が突然null可能になるのはなぜですか?私の意図がnull許容列をそこに取得することであることを明確にするためのより良い方法(コメント以外)はありますか?

4

3 に答える 3

17

決定的な答えがここにあるようです。ここにコピー:

メタデータは、ソース列と SELECT リストで使用される式に基づいて決定されます。以下にルールを示します。

  1. たとえば、SUBSTRING、LEFT、RIGHT など (ISNULL を除く) などの組み込み関数を使用する式は、エンジンによって NULL 許容と見なされます。したがって、CAST(somecol as char(8)) を使用すると、式は NULLable になります

  2. リテラル、定数、@@DBTS、@@ERROR などのグローバル変数は、常に何らかの値を返すため、NULL 不可と見なされます。

  3. 式が列である場合、NULL 可能性はソース列のメタデータから派生します

    したがって、SELECT リスト内の式または列を null 以外にするには、列または式を ISNULL で囲みます。

したがって、CAST 式を安全に使用できるようです。

于 2012-08-08T20:33:59.690 に答える
6

の簡単な一般的なヒントSELECT ... INTO:ISNULL(列で使用すると、テーブルに NOT NULL 列として作成されます。

于 2018-01-25T18:01:46.673 に答える
0

個人的には、最適な制御のために、最初にテーブルを作成する必要があります。例えば:

Create Table #MyTable (
   SerialNumber int Not Null, -- or however this is correctly defined.
   Action int Null
)

次に、Insert Into ... Select From ... を実行します。

Insert Into #MyTable(SerialNumber, Action)
Select SerialNumber, 0
From FSE_SerialNumber

そうすれば、フィールドがどうあるべきかという問題はなくなります。

これはあなたが尋ねたものではないことはわかっていますが、考慮すべきことかもしれません。

于 2012-08-08T20:04:26.007 に答える