2012-08-14 4 views
-1

SQL 삽입 문에 문제가 있습니다.열이있는 곳으로 SQL 삽입

현재 Insert 문은 .CSV 파일의 데이터를 SQL 테이블로 전송하는 데 사용되지만 .CSV 파일의 내용이 다를 수 있습니다. 예를 들어 .CSV 파일의 내용이 이전과 다른 열을 포함 할 수 있습니다.

.CSV 파일에서 데이터를 가져 오는 데 사용하는 문은 .CSV가 나타나는 임시 테이블을 만드는대로 다른 열을 지원합니다.

INSERT INTO RTCU(ItemDATE, ItemTIME, SITENAME, GENSETNAME, GENSET_SN, REASON, EVENT, RPM, Pwr 
       ,Gfrq ,Vg1 ,Vg2 ,Vg3 ,Vg12 ,Vg23 ,Vg31, Ig1, Ig2, Ig3, Mfrq, Vm1, Vm2, Vm3 
       ,Vm12 ,Vm23 ,Vm31 ,BIN ,BOUT ,Mode ,CCpres ,OilLev 
       ,ActDem ,OilT ,AirInT ,RecAT ,JWTout ,JWTin ,JWGKin ,CylA1 ,CylA2 ,CylA3 ,CylA4 ,CylA5 
       ,CylA6 ,CylB1 ,CylB2 ,CylB3 ,CylB4 ,CylB5 ,CylB6 ,ActPwr ,kWhour ,Runhrs ,VRO)  
SELECT CONVERT(DATETIME,ItemDATE,103), ItemTIME, SITENAME, GENSETNAME, GENSET_SN, REASON, EVENT, RPM, Pwr 
       ,Gfrq ,Vg1 ,Vg2 ,Vg3 ,Vg12 ,Vg23 ,Vg31, Ig1, Ig2, Ig3, Mfrq, Vm1, Vm2, Vm3 
       ,Vm12 ,Vm23 ,Vm31 ,BIN ,BOUT ,Mode ,CCpres ,OilLev 
       ,ActDem ,OilT ,AirInT ,RecAT ,JWTout ,JWTin ,JWGKin ,CylA1 ,CylA2 ,CylA3 ,CylA4 ,CylA5 
       ,CylA6 ,CylB1 ,CylB2 ,CylB3 ,CylB4 ,CylB5 ,CylB6 ,ActPwr ,kWhour ,Runhrs ,VRO 
FROM tmpDATA 

하지만 당신은 내가 고정 복사 열을 볼 수있는 내 .CSV 파일 중 하나가 열 "HeatMeter"가 그래서 만약 어떤 방법 것 :

내가 현재 사용하는 삽입 문이다 이 열을 RTCU 테이블에 복사하는 방법에 대해 알고 싶습니다.

미리 감사드립니다. 닐

+1

대상 테이블에 해당 필드가없는 경우 해당 필드를 테이블에 삽입 할 수 없습니다. 필드에 삽입 할 데이터의 경우 해당 필드가 있어야합니다. 그래서, 기존 테이블에 필드를 추가하는 방법을 묻고 있습니까? 또는'table1.fieldX'를'table2.fieldY'에 삽입하는 방법을 묻고 있습니까? 지금이 질문에 '이 둥근 구멍에이 사각형 못을 어떻게 끼워 넣을 수 있습니까?'라는 질문이 있지만 실제로 어떤 접근 방식이 도움이 될지 이해하는 데 필요한 명확한 설명이 필요하다고 생각합니다. – MatBailie

+0

대상 테이블에 열이 있지만 소스 테이블에 해당 열이 있거나 없을 수 있습니다. 그래서 예를 들어 소스 A는 소스 B가 'Pwr, RPM, Volts, Freq, Mode, CCpres, OilLev'를 가질 수있는 'Pwr, RPM, Volts, Freq, Mode'열을 가질 수 있으며 결과 A + B는 'Pwr, RPM , Volts, Freq, Mode, CCpres, OilLev '어떻게 소스 A와 B의 서로 다른 내용이 결과에 복사되는지 확인합니까? – neilrudds

답변

0

I 해요 나는 당신의 요구를 이해하지만 당신은이 여기 내 추측 ... 당신은 대상 테이블이

...

ID | val_1 | val_2 | val_3 

임을 100 % 확신하지 소스 테이블 ...

ID | val_1 | val_3 

그리고 두 번째 소스 테이블을 가지고 ...

ID | val_2 | val_3 

당신은 대상 테이블에 두 개의 서로 다른 소스에서 데이터를 삽입 할 ....

하나의 옵션은 ...

CREATE TABLE destination (
    id  INT, 
    val_1 INT DEFAULT(-1), 
    val_2 INT DEFAULT(-2), 
    val_3 INT DEFAULT(-3) 
) 

-- val3 is not specified in this insert 
-- This means that it will appear as -3 for all the inserted rows 
------------------------------------------------------------------ 
INSERT INTO destination (id, val_1, val_2) 
SELECT id, val_1, val_2 FROM source1 

-- val1 is not specified in this insert 
-- This means that it will appear as -1 for all the inserted rows 
------------------------------------------------------------------ 
INSERT INTO destination (id, val_2, val_3) 
SELECT id, val_2, val_3 FROM source2 

또 다른 옵션 다른 컬럼에 디폴트 값을 지정하는 것입니다

-- source1 does not have a val_3 field, so we hard-code the insert 
-- to always put NULL in that field. 
------------------------------------------------------------------- 
INSERT INTO destination (id, val_1, val_2, val3) 
SELECT id, val_1, val_2, NULL FROM source1 

-- source2 does not have a val_1 field, so we hard-code the insert 
-- to always put 0 in that field. 
------------------------------------------------------------------- 
INSERT INTO destination (id, val_1, val_2, val_3) 
SELECT id, 0, val_2, val_3 FROM source2 

모든 값

가 기본 또는 하드 코딩 된 값으로 사용할 수 있습니다 ... 당신은 '실종'필드에 표시 할 어떤 값을 단순히 하드 코드이다.

+0

Dems, 나는 소스 테이블이 항상 동일한 이름 tmpDATA를 갖기 때문에 이것이 작동한다고 생각하지 않는다. 이 tmpDATA 테이블은 CSV 파일에 포함 된 내용에 따라 동적으로 생성됩니다. 따라서 CSV에있는 모든 열에 대해 열은 tmpDATA 테이블에 만들어집니다. 모든 CSV는 내 질문에 위와 같이 변하지 않는 몇 가지 공통 열을 갖지만 tmpDATA 테이블에 존재하거나 존재하지 않는 가변 열도있을 것입니다.같은 : INSERT INTO RTCU (ItemDATE, ItemTIME, Variable1) 전환 시간 (DATETIME, ItemDate, 103), ItemTime, (EXIFTS (변수 1) IF) tmpDATA에서 – neilrudds

+0

@ NeeRutherford - 위의 예제에서는 두 가지 다른 삽입 진술. 대상 테이블에 코드를 삽입 할 때 어떤 값이 어디로 가야하는지 지정해야합니다. 소스 스키마가 매번 다른 경우 insert 문은 매번 달라야합니다. 다음 세 가지 기본 선택 사항이 있습니다. 1. 값이 공백 인 경우에도 모든 필드가 CSV에 있음을 보장하는 규칙을 적용합니다. 2. 파일을 수신 할 때마다 다른 삽입 명령문을 수동으로 코딩하십시오. 3. 새 SQL Insert 문 (동적 SQL이라고 함) *을 작성하는 코드를 SQL 또는 다른 언어로 작성하십시오. – MatBailie

관련 문제