1

これは私が持っている種類のデータです:

ENT*2*2J*EI*A25530181
NM1*IL*1*DOBIAS*ROSE*M
RMR*AZ*10100314**362.45
DTM*582****RD8*20120301-20120331
ENT*3*2J*EI*A54700554
NM1*IL*1*LOMBARDO*LUIS*J
RMR*AZ*10100314**362.45
DTM*582****RD8*20120301-20120331

状況は、各行から情報を抽出し、それを別のテーブルに入力する必要があるということです。ENT で始まる行のように、コード A25530181 が必要で、それを別のテーブルに入れます。情報を抽出するためのすべてのロジックがダウンしています。カーソルなしで別のテーブルに配置する方法を理解する必要があります。このテーブルの最初の 4 行の情報が新しいテーブルの 1 行になります。そう

ENT*2*2J*EI*A25530181
NM1*IL*1*DOBIAS*ROSE*M
RMR*AZ*10100314**362.45
DTM*582****RD8*20120301-20120331

を使用して、上記のデータからクライアント コード、日付、および金額を新しいテーブルの 1 行に入力します。Row is DTM は日付を提供し、RMR の行はレートを提供します。情報を抽出するためのロジックがダウンしています。カーソルなしで新しいテーブルに入れるのに助けが必要です。

サンプル ロジックは次のとおりです。

SELECT @Asterisk1Pos = CHARINDEX(@Delimeter, REVERSE(DATA)) - 1
from @TEMP_TABLE
WHERE LEFT(DATA,3) = 'ENT'

SELECT TOP 1 RIGHT(DATA, @Asterisk1Pos) 
from @TEMP_TABLE 
WHERE LEFT(DATA,3) = 'ENT'

このようにして、1行だけの情報が得られます。

4

1 に答える 1

1

あなたは、レコードからデータを解析するための抽出ロジックがダウンしていると言っているので、それについては詳しく説明しません。あなたの問題は、内容に従って各レコードを処理する必要があり、DTS または SSIS を使用できず、T-SQL を使用できますが、カーソルを使用できないことです。

DTS または SSIS を使用できる場合、または PC プログラミング言語を使用してレコードを処理し、insert ステートメントを実行できる場合は、そうしてください。これがその場限りのものであり、Excel でレコードを前処理することができる場合は、T-SQL でこれを実現する前にそれを行うこともできます。ただし、これらのいずれにも当てはまらず、使用しているツールが T-SQL だけである場合、私があなたの立場にあるとしたら、次の手順を実行します。

  1. レコードを含む一時テーブルを作成しますが、行番号を表す列を追加します。これは、ROW_NUMBER() 関数を使用して取得できます。(調べてみてください。構文は、ほとんどの T-SQL 関数とは少し異なります。)

  2. @Temp一時テーブルが呼び出され、フィールドが and とRecordNumber呼ばれると仮定するとData、次のように、1 つのレコードに一緒に属する 4 つの (常に 4 つですよね?) レコードを結合する別の一時テーブルを作成します。

    SELECT T1.RecordNumber、T1.data を Data1、T2.data を Data2、T3.data を Data3、T4.data を Data4 FROM @Temp T1 JOIN @Temp T2 ON T1.RecordNumber = T2.RecordNumber - 1 JOIN @Temp T3 ON T1.RecordNumber = T3.RecordNumber - 2 JOIN @Temp T4 ON T1.RecoreNumber = T4.RecordNumber - 3

    2 番目の一時テーブルを と呼びます@Temp2

  3. @Temp2 から 5 つのフィールドすべてをパラメーターとして受け取り、テーブル値関数を返すテーブル値関数を記述します。出力テーブル形式はターゲット テーブルの形式になります。これは、すべての解析ロジックを配置する場所です。関数が呼び出されたとしましょうdbo.udf_Function1

  4. 次のように、ターゲット テーブル (ターゲットと呼びます) に挿入します。

    INSERT INTO @Target SELECT F1.* FROM @Temp2 T2 CROSS APPLY dbo.udf_Function1(T2.RecordNumber, T2.Data1, T2.Data2, T2.Data3, T2.Data4) F1

これは、(私が思うに) SQL 2005 で導入された CROSS APPLY 機能のために機能します。各呼び出しによって返された単一のレコードudf_Function1を、挿入で選択できる 1 つのレコード セットに集約する効果があります。

于 2012-04-20T01:10:32.180 に答える