ms-access 쿼리에서 여러 개의 삽입 문을 만드는 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/62504

  •  09-06-2019
  •  | 
  •  

문제

MS Access 2003을 사용하고 있습니다.MS Access의 '쿼리'라는 항목에서 많은 삽입 SQL 문을 실행하고 싶습니다.그것을 할 수 있는 쉬운(또는 실제로 어떤 방법이라도) 있나요?

도움이 되었습니까?

해결책

예, 아니오.

당신은 할 수 없습니다:

insert into foo (c1, c2, c3)
values ("v1a", "v2a", "v3a"),
       ("v1b", "v2b", "v3b"),
       ("v1c", "v2c", "v3c")

하지만 넌 할 수 있어

insert into foo (c1, c2, c3)
    select (v1, v2, v3) from bar

아직 테이블에 데이터가 없다면 무슨 소용이 있을까요?글쎄, 하드 코딩된 결과를 사용하여 많은 Select 조합으로 구성된 Select 문을 작성할 수 있습니다.

INSERT INTO foo (f1, f2, f3)
    SELECT *
    FROM (select top 1 "b1a" AS f1, "b2a" AS f2, "b3a" AS f3 from onerow
    union all
    select top 1 "b1b" AS f1, "b2b" AS f2, "b3b" AS f3 from onerow
    union all 
    select top 1 "b1c" AS f1, "b2c" AS f2, "b3c" AS f3 from onerow)

메모:또한 공용체를 허용하도록 액세스를 속이기 위해 일종의 더미 테이블(예: onerow)을 포함해야 하며(최소 하나의 행이 있어야 함) 이를 방지하려면 "상위 1"이 필요합니다. 행이 두 개 이상인 테이블에 대한 반복 가져오기

그러나 다시 한 번, 특히 루프에 이미 물건을 구축하는 경우 세 가지 별도의 삽입문을 수행하는 것이 더 쉬울 것입니다 (물론 인서트를 수행하는 데 드는 비용이 코딩하는 데 드는 비용보다 큽니다). .

다른 팁

개인적으로 저는 이를 수행하기 위해 VBA 서브루틴을 만들고 SQL 연결 형식을 사용하여 데이터베이스에 연결합니다.

내 머리 꼭대기에서 이를 수행하는 코드는 다음과 같아야 합니다.

Sub InsertLots ()
    Dim SqlConn as Connection
    SqlConn.Connect("your connection string")
    SqlConn.Execute("INSERT <tablename> (column1, column2) VALUES (1, 2)")
    SqlConn.Execute("INSERT <tablename> (column1, column2) VALUES (2, 3)")
    SqlConn.Close()
End Sub

코드가 실행될 컨텍스트를 명확히 하지 않은 상태에서 Jonathan처럼 특정 데이터 인터페이스를 제안하는 것은 바람직하지 않다고 생각합니다.

데이터 저장소가 Jet 데이터베이스인 경우 선호하는 스크립팅 플랫폼에서 코드를 실행하지 않는 한 ADO 형식을 사용하는 것은 거의 의미가 없습니다.Access를 사용하는 경우 이는 확실히 사실이 아니며 DAO가 선호되는 인터페이스입니다.

아니요. Access의 쿼리는 단일 SQL 문입니다.하나의 쿼리 개체 내에서 여러 문을 일괄적으로 생성할 수 있는 방법은 없습니다.여러 쿼리 개체를 만들고 매크로/모듈에서 실행할 수 있습니다.

@릭 가너:'배치'가 무엇을 의미하는지 잘 모르겠지만

INSERT INTO foo (f1, f2, f3)
    SELECT *
    FROM (select top 1 "b1a" AS f1, "b2a" AS f2, "b3a" AS f3 from onerow
    union all
    select top 1 "b1b" AS f1, "b2b" AS f2, "b3b" AS f3 from onerow
    union all 
    select top 1 "b1c" AS f1, "b2c" AS f2, "b3c" AS f3 from onerow)

단일 SQL이기는 하지만 구성 성명, 실제로는 각 행을 한 번에 하나씩(한 번에 모두 삽입하지 않고) 동일한 트랜잭션에 삽입합니다.예를 들어 관련 제약 조건을 추가하여 이를 테스트할 수 있습니다.

ALTER TABLE foo ADD
   CONSTRAINT max_two_foo_rows
      CHECK (2 >= (SELECT COUNT(*) FROM foo AS T2));

테이블이 비어 있다고 가정하면 위의 내용은 INSERT INTO..SELECT.. 작동해야합니다 :그렇지 않다는 사실은 세 행을 모두 삽입한 후가 아니라 첫 번째 행을 삽입한 후에 제약 조건을 검사했기 때문입니다(ANSI SQL-92 위반이지만 이는 MS Access입니다).테이블이 비어 있다는 사실은 내부 트랜잭션이 롤백되었음을 나타냅니다.

@데이비드 W.펜톤:귀하는 DAO를 개인적으로 선호할 수도 있지만 다른 사람이 대체 데이터 액세스 기술(이 경우 ADO)을 선택하는 것을 너무 가혹하게 여기지 마십시오. 특히 바닐라의 경우 INSERT 그리고 그들이 자신의 의견을 "내 머리 속에 떠오르는 코드는 다음과 같아야 하는데..."라고 평가할 때 결국 DAO를 사용하여 CHECK 제약 :)

MS Access는 동일한 SQL 창에서 다중 삽입을 허용하지 않습니다.당신이 원한다면 끼워 넣다, 말하다 테이블의 행 10개, 말하다 영화(mid, mname, mdirector,....), SQL Windows를 열어야합니다.

  1. 첫 번째 stmt를 입력하고, 첫 번째 stmt를 실행하고, 첫 번째 stmt를 삭제합니다.
  2. 두 번째 stmt를 입력하고, 두 번째 stmt를 실행하고, 두 번째 stmt를 삭제합니다.
  3. 세 번째 stmt 입력, 세 번째 stmt 실행, 세 번째 stmt 삭제 ......

매우 지루한.대신 다음을 수행하여 Excel에서 라인을 가져올 수 있습니다.

  1. 이미 생성한 테이블 이름을 마우스 오른쪽 버튼으로 클릭하세요.
  2. Excel에서 가져오기(가져오기 대화 상자가 열림)
  3. 테이블에서 가져올 레코드가 포함된 Excel 파일을 찾습니다.
  4. "테이블에 레코드 사본 추가:"를 클릭합니다.
  5. 필요한 테이블을 선택하세요(이 예제 동영상에서는).
  6. "확인"을 클릭하세요
  7. 스프레드시트의 데이터가 포함된 워크시트를 선택하세요.
  8. 마침을 클릭하세요

Excel의 전체 데이터세트가 "MOVIE" 테이블에 로드되었습니다.

MS Access에서는 간단한 텍스트 파일의 데이터를 테이블에 추가할 수도 있습니다.값을 CSV로 표시하고(모두 바꾸기 상자를 사용하여 쉼표만 제외하고 모두 삭제함) 외부 데이터에서 텍스트 파일을 선택합니다.

From this:
INSERT INTO CLASS VALUES('10012','ACCT-211','1','MWF 8:00-8:50 a.m.','BUS311','105');
INSERT INTO CLASS VALUES('10013','ACCT-211','2','MWF 9:00-9:50 a.m.','BUS200','105');
INSERT INTO CLASS VALUES('10014','ACCT-211','3','TTh 2:30-3:45 p.m.','BUS252','342');
To this:
10012,ACCT-211,1,MWF 8:00-8:50 a.m.,BUS311,105
10013,ACCT-211,2,MWF 9:00-9:50 a.m.,BUS200,105
10014,ACCT-211,3,TTh 2:30-3:45 p.m.,BUS252,342
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top