0

SQL Server 2008 では、文字列の長さの制御に関する大きな問題に直面していました。

システムの簡単な要約:

  • *.txtSQL Server 環境での一括挿入を使用して、ファイル (セパレータとしてセミコロン)から永続的なステージング領域にデータをインポートします。
  • PSA テーブルでは、すべての列はvarchar(MAX);
  • 複数の where 条件を持つ選択に基づく挿入ステートメントを使用したクリーニング操作。

私たちが扱う問題は、単一の列の型と長さにあります。実際、データ ウェアハウス レベルでは、列は数値でなければならず、その長さは 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数値ではない値も考慮することができ、最初に最大次元が重複します。

その結果、挿入ステートメントは返されます

文字列 o バイナリ データは切り捨てられます

エラーが発生し、挿入に失敗します。

前もって感謝します!私はあなたの助けを楽しみにしています!!!

エンリコ

4

2 に答える 2

0

私は何が悪いのかを理解しました。内部選択では、フォーマットの制約と重複(の意味count(*)=1)を考慮しないすべてのレコードを選択から除外し、宛先テーブルのPKのみを抽出しました。ただし、PKを使用して選択すると、重複しているがフォーマット制約によって除外されたレコードも取得され、ディメンションの問題により挿入エラーが発生します。

今、私はステップを分割しました:

  1. ルックアップと削除を複製します
  2. フォーマット制約のある選択

できます!

于 2012-04-18T14:49:33.040 に答える
0

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

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

ただし、データ モデルを見ないとわかりません。

于 2012-04-17T19:41:48.330 に答える