2009-05-04 7 views
5

SQL 2008 Express Edition을 사용하고 있고 C# 응용 프로그램을 통해 여러 행 삽입을 시도하고 있습니다.여러 행 삽입 -> 문이 허용되는 최대 행 개수 값인

약 10 만 개의 레코드가 삽입되어야합니다.

이 좋아 모두는 내가 오류지고있어 처음 1000 개 개의 레코드에 대해 잘 어울린다 ". INSERT 문에서 행 값 식의 수는 1,000 행 값의 최대 허용 수를 초과"

내 열 데이터 형식 -> int로 보았으므로 문제가 될 수 없습니다. 코드를 검사하고 500 레코드 단위로 삽입하고 있습니다.

그래서 나는 그것을 봤지만 아무것도 유용 찾을 수 없습니다. 누군가가 왜이 오류가 발생했는지 그리고 가능한 경우 해결 방법을 설명 할 수 있습니까?

+1

코드를 보여줄 수 있습니까? 이 오류 메시지는 행 값을 사용하는 경우에만 발생해야합니다. INSERT INTO ... VALUES (...), (...), (...) <- 3 개의 행이 있으며 제한은 1000입니다. –

+0

삽입 쿼리 사이에 지연이 필요합니까? – nlucaroni

+0

한 번에 한 행을 삽입하려고하십니까? 모든 삽입을 한 번에 수행하도록 저장 프로 시저를 호출하십시오 (아직 수행하지 않은 경우) – northpole

답변

5

SQLBulkCopy 클래스를 사용할 수 있습니다. 일괄 처리, 트랜잭션을 지원하며 표준 삽입 문보다 효율적입니다.

+0

"원본 테이블과 대상 테이블이 동일한 SQL Server 인스턴스에 있으면 Transact-SQL INSERT를 사용하는 것이 더 쉽고 빠릅니다 ... 데이터를 복사하려면 SELECT 문을. " 출처 : http://msdn.microsoft.com/en-us/library/s4s223c6.aspx 기록 용으로 만 사용하십시오. :) – ShdNx

0

이 내 코드 내가 SqlBulkCopy의를 확인하는거야

var count = "SELECT COUNT(*) as rowcount FROM table_mysql GROUP BY id"; 

var countReader = Retrieve(count); 
var countRows = 0; 
try 
{ 
    while (countReader.Read()) 
    { 
     countRows += int.Parse(countReader.GetValue(0).ToString()); 
    } 
} 
catch (Exception ex) 
{ 
    Log.LogMessageToFile("Import.cs -> table_mssql: " + ex.StackTrace + " /n" + ex.Message); 
} 
finally 
{ 
    if (countReader != null) { countReader.Close(); _crud.close_conn(); } 
} 

for (var a = 0; a < countRows;) 
{ 
    var sql = "SELECT id, traffic_id, dow, uu, imps, impsuu, otsw, otsm FROM table_mysql LIMIT " + a + ", " + (a + 500) + ""; 

    var reader = Retrieve(sql); 
    try 
    { 
     var builder = new StringBuilder(); 
     builder.Append(
      "SET IDENTITY_INSERT table_mssql ON;INSERT INTO table_mssql(id, traffic_id, dow, uu, imps, impsuu, otsw, otsm) VALUES "); 
     while (reader.Read()) 
     { 
      Application.DoEvents(); 
      try 
      { 
       builder.Append("(" + reader.GetValue(0) + ", " + reader.GetValue(1) + ", " + 
           reader.GetValue(2) + 
           ", " + reader.GetValue(3) + ", " + reader.GetValue(4) + 
           ", " + reader.GetValue(5) + ", " + reader.GetValue(6) + ", " + 
           reader.GetValue(7) + 
           "), "); 

      } 
      catch (Exception ex) 
      { 
       Log.LogMessageToFile("Import.cs -> table_mssql: " + ex.StackTrace + " /n" + ex.Message); 
      } 
     } 

     var sqlDB = builder.ToString(0, builder.Length - 2); 

     sqlDB += ";SET IDENTITY_INSERT table_mssql OFF;"; 
     if (!InsertDB(sqlDB)) 
     { 
      Log.LogMessageToFile("Import.cs -> table_mssql: No insert happend!"); 
     } 
    } 
    catch (Exception ex) 
    { 
     Log.LogMessageToFile("Import.cs -> table_mssql: " + ex.StackTrace + " /n" + ex.Message); 
     return false; 
    } 
    finally 
    { 
     if (reader != null) 
     { 
      reader.Close(); 
      _crud.close_conn(); 
     } 
    } 
    a = a + 500; 
} 

다중 삽입을 처리하는 방법입니다. 어쩌면 그것은 더 나은 해결책 일 것입니다. 또한

var sql = "SET IDENTITY_INSERT table_mssql ON;" 
     + "INSERT INTO table_mssql" 
     +  "(id, traffic_id, dow, uu, imps, impsuu, otsw, otsm)" 
     + " SELECT id, traffic_id, dow, uu, imps, impsuu, otsw, otsm " 
     + " FROM table_mysql;" 
     + "SET IDENTITY_INSERT table_mssql OFF;"; 

if (!InsertDB(sqlDB)) 
{ 
    Log.LogMessageToFile("Import.cs -> table_mssql: No insert happend!"); 
} 

:

+0

위에서 설명한 lassevk와 마찬가지로 해당 메소드의 한계는 1000 행입니다. INSERT INTO tblName SELECT ... FROM otherTbl 구문을 살펴 보길 원할 것입니다. 사용자가 수행하는 작업이 다른 SQL 문에서 거의 직접적으로 이루어진 것으로 보이기 때문입니다. 여기에는 행 제한이 없습니다. – Eric

0

당신이 아래로 그 모든 일이 걸릴 수 있습니다 당신은 SQL Server가 MySQL을의 LIMIT 키워드를 지원하지 않는다는 것을 알아야한다. 대신 TOP 또는 ROW_NUMBER을 사용합니다.

+0

첫 번째 쿼리가 데이터를 검색하기 위해 mysql 데이터베이스에 액세스 할 때도 적용 할 수 있습니까? mysql 데이터베이스에서 로컬 SQL Server 2008 Express로 데이터를 전송해야합니다. – Gerbrand

+0

아, 이제 명명 규칙을 얻을 수 있습니다. 코드 스 니펫과 질문의 텍스트는 모든 것이 동일한 연결, 이름 또는 이름을 거치지 않은 것처럼 보입니다. 이 경우 클라이언트의 데이터를 간단하게 보관해야하며 BULK_INSERT는 가장 빠른 옵션입니다. –

+0

또는 행운을 빌어 db 데이터베이스에 SQL 데이터베이스를 연결할 수 있습니다 : http://developer.infi.nl/index.php?ID=6&article=6 –