1

2 つのテーブルがあり、一方から他方に挿入したいと考えています。私のステージング (ソース) テーブルでは、すべての列が次のように定義されてnvarchar(300)おり、この制限は変更できません。

私の宛先テーブルでは、列はすべて異なるタイプです。たとえば、ソース テーブル (データ型nvarchar(300)) から選択し、その列をデータ型に挿入したい場合decimal(28, 16)

これが発生すると、次のエラーが発生します。

データ型 nvarchar を数値に変換中にエラーが発生しました。

キャストを使用してもエラーが発生します。

INSERT INTO Destination (
    Weighting
)
VALUES (
    CAST(src.Weighting AS decimal(28, 16))
)

nullがこれに影響を与える可能性はありますか? 他に考慮すべきことはありますか?

4

5 に答える 5

1

これにより、数値以外の文字列が検索されます

isnumeric(src.Weighting) = 0 である src から src.Weighting を選択します。

于 2012-12-18T15:26:22.320 に答える
1

ステージング テーブル列のすべてのデータをターゲット データ型に暗黙的に変換できる場合は、明示的なキャストを設定する必要はありません。

ただし、1 つの値を暗黙的に変換できない場合 (つまり、1 つのセルに、型列になるはずの非数値または不適切な形式の文字列値が含まれている場合decimal)、トランザクション全体が失敗します。

次のように挿入を設定することで、失敗したトランザクションのリスクを移行できます。

INSERT
  LiveTable (
    VarcharCol,
    DecimalCol,
    NonNullableCol
  )
SELECT
  NvarcharCol1,
  CASE ISNUMERIC(nvarcharCol2) = 0 THEN NvarcharColl2 END,
  ISNULL(NvarcharCol3, '')
FROM
  StagingTable

しかし、これは明らかに、関連する可能性のあるデータや数値精度を失うリスクを意味します。

MSDN で、相互に暗黙的に変換できるデータ型を確認できます(マトリックスまでスクロールします)。他のすべての変換では、CASTまたはを使用する必要がありますCONVERT

于 2012-12-18T15:31:39.930 に答える
0

nullは、ターゲット列でnullが許可されていない場合にのみ問題になります。問題は、フォーマット文字列が常に10進数に変換できるとは限らないことです。小数点がポイントではなく、コンマであるかどうかを確認してください。

于 2012-12-18T15:40:04.703 に答える
0

TSQLには、データを目的のタイプにキャストまたは変換するための関数があります。ソースのデータ型が、宛先テーブルのように厳密に格納しようとしているものであり、宛先テーブルの仕様に含まれている場合は、それほど問題はありません。

数字の列があり、そのうちの1つが「3」ではなく「3」である場合、複雑になります。 varcharを10進数に変換することについての質問があります

例:123をvarchar(20)としてキャストしてから、適切な場合は問題なくvarcharを10進数にキャストできます。

SELECT cast(cast('123' as varchar(20)) as decimal(8,2))

ただし、文字を変換しようとするとエラーが発生します。

SELECT cast(cast('1a3' as varchar(20)) as decimal(8,2))
于 2012-12-18T15:38:18.867 に答える
0
INSERT INTO Destination (Weighting)
SELECT CAST(src.Weighting AS decimal(28, 16))
  FROM [Source] src

varchar 値が正しい形式であれば、問題なく動作するはずです。それでもエラーが発生する場合は、変換された値の例を教えてください。

NULL は正常に NULL に変換されます。

于 2012-12-18T15:24:49.527 に答える