2012-04-10 8 views
0

SQL Server内の文字列の長さを制御して大きな問題に直面しているし、フィールド長制御の問題2008年SQL Serverの:

我々のシステムの簡単な要約:永続的なステージング領域で

  • データをインポートします*.txtファイル(セミコロンは区切り記号)から、SQL Server環境で一括挿入を使用します。
  • PSA表のすべての列はvarchar(MAX)です。
  • 複数のwhereを条件とするselectに基づくinsert文を使用したクリーニング操作。

私たちが扱う問題は、単一の列タイプと長さです。実際にデータウェアハウスレベルでは数値でなければならず、その長さは13桁を超えてはいけません。

選択は以下の通りです:

select cast(LTRIM(RTRIM(data_giacenza)) as numeric), 
         LTRIM(RTRIM(codice_socio)), 
         LTRIM(RTRIM(codice_gln)), 
         LTRIM(RTRIM(tipo_gln)), 
         LTRIM(RTRIM(codice_articolo_socio)), 
         LTRIM(RTRIM(codice_ean_prodotto)), 
         LTRIM(RTRIM(codice_ecat_prodotto)), 
         LTRIM(RTRIM(famiglia)), 
         LTRIM(RTRIM(marca)), 
         LTRIM(RTRIM(classificazione_liv_1)), 
         LTRIM(RTRIM(classificazione_liv_2)), 
         LTRIM(RTRIM(classificazione_liv_3)), 
         LTRIM(RTRIM(classificazione_liv_4)), 
         LTRIM(RTRIM(modello)), 
         LTRIM(RTRIM(descrizione_articolo)), 
         cast(LTRIM(RTRIM(giacenza)) as numeric), 
         cast(LTRIM(RTRIM(acquistato)) as numeric), 'X' FROM psa_stock a 
          where EXISTS 
          ( 
          SELECT 0 
          FROM(
           SELECT 
              data_giacenza 
              ,codice_socio 
               ,codice_gln 
               ,codice_articolo_socio 
               FROM psa_stock 
      where 
         LEN(LTRIM(RTRIM(data_giacenza))) = 8 and LEN(LTRIM(RTRIM(codice_socio))) = 3 
        and LEN(LTRIM(RTRIM(codice_gln))) = 13 and LEN(LTRIM(RTRIM(tipo_gln))) = 3 
        and LEN(LTRIM(RTRIM(codice_articolo_socio))) <= 15 
        and (LEN(LTRIM(RTRIM(codice_ean_prodotto))) <= 13 or LEN(ISNULL(codice_ean_prodotto, '')) = 0) 
        and (LEN(LTRIM(RTRIM(codice_ecat_prodotto))) = 9 or LEN(ISNULL(codice_ecat_prodotto, '')) = 0) 
        and LEN(LTRIM(RTRIM(famiglia))) = 2 
        and (LEN(LTRIM(RTRIM(marca))) <= 20 or LEN(ISNULL(marca, '')) = 0) 
        and (LEN(LTRIM(RTRIM(modello))) <= 30 or LEN(ISNULL(modello, '')) = 0) 
        and (LEN(LTRIM(RTRIM(descrizione_articolo))) <= 50 or LEN(ISNULL(descrizione_articolo, '')) = 0) 
        and LEN(LTRIM(RTRIM(giacenza))) <= 5 
        and LEN(LTRIM(RTRIM(acquistato))) <= 5 
        and (LEN(LTRIM(RTRIM(classificazione_liv_1))) <= 15 or LEN(ISNULL(classificazione_liv_1, '')) = 0) 
        and (LEN(LTRIM(RTRIM(classificazione_liv_2))) <= 15 or LEN(ISNULL(classificazione_liv_2, '')) = 0) 
        and (LEN(LTRIM(RTRIM(classificazione_liv_3))) <= 15 or LEN(ISNULL(classificazione_liv_3, '')) = 0) 
        and (LEN(LTRIM(RTRIM(classificazione_liv_4))) <= 15 or LEN(ISNULL(classificazione_liv_4, '')) = 0) 
        and ISNUMERIC(ltrim(rtrim(REPLACE(data_giacenza, ' ', '')))) = 1 
        and ISNUMERIC(ltrim(rtrim(REPLACE(codice_gln, ' ', '')))) = 1 
        and ISNUMERIC(LTRIM(RTRIM(REPLACE(giacenza, ' ', '')))) = 1 and charindex(',', giacenza) = 0 
        and ISNUMERIC(LTRIM(RTRIM(REPLACE(acquistato, ' ', '')))) = 1 
        and ISNUMERIC(ltrim(rtrim(REPLACE(codice_ean_prodotto, ' ', '')))) = 1 
        and ISNUMERIC(ltrim(rtrim(REPLACE(codice_ecat_prodotto, ' ', '')))) = 1 
        and codice_socio in (select codice_socio from ana_socio) 
        and tipo_gln in (select tipo from ana_gln) 
        and codice_gln in (select codice_gln from dw_key_gln) 
        group by 
       data_giacenza 
       ,codice_socio 
        ,codice_gln 
        ,codice_articolo_socio 
          having COUNT (*) = 1 
       ) b 
      where 
       a.data_giacenza = b.data_giacenza and 
       a.codice_articolo_socio = b.codice_articolo_socio and 
        a.codice_socio = b.codice_socio and 
        a.codice_gln = b.codice_gln) 

臨界磁場がcodice_ean_prodottoです。

実際には数値ではなくSEAGAT7636490026751,NE20000003039,NE20000002168という値も考慮に入れることができます。これらの値は数値ではなく、最初の重複する最大値です。

その結果、insert文は、バイナリデータO

文字列

エラーを切り捨て、挿入に失敗したことになるバック

を与えます。

ありがとうございます!私はあなたの助けを楽しみにしています!

エンリコ

答えて

0

あなたは、そのクエリを実行し、where句にcodice_ean_prodotto = 'NE20000003039'を追加しようとしたことがありますか?これらが実際に問題を引き起こしているフィールドであることを確認してください。 selectがそのwhere節を持つ行を返すと、ロジックに何か問題があります。

EXISTSサブクエリのhaving COUNT (*) = 1句に向かっています。これらの特定のキーに複数のレコードを含めることは可能ですか? PKがこれらの4つのフィールド(data_giacenza, codice_articolo_socio, codice_socio, codice_gln)で構成されている限り、GROUP BY句とHAVING句はまったく必要ありません。主キーに参加していない場合は、それが原因である可能性があります。

しかし、あなたのデータモデルが見えないと言うのは難しいです。

0

私は何が間違っているかを考え出しました。 内部選択では、書式の制約と重複(意味はcount(*)=1の意味)を除いたすべてのレコードを除外し、宛先テーブルのPKのみを抽出しました。 しかし、PKで選択すると、重複しているがフォーマット制約によって除外されたレコードも検索され、ディメンションの問題により挿入がエラーにつながります。それが動作する形式の制約

  1. 重複検索と削除
  2. 選択:

    は今、私は段階を分け!