2017-11-13 1 views
0

이 요구 사항의 이유는 너무 길기 때문에 관련이 없습니다.SQL Server - Insert 문에있는 동적 열 수

나는 폭이 넓은 테이블 Table_1과 256 열을 가지고 있으며 모두 NVARCHAR(512)이며 null을 허용합니다.

반면 동적 선택이 내장 된 문자열이 있는데, 경우에 따라 다른 수의 열을 생성합니다.

쿼리 결과를 Table_1에 삽입해야합니다.

문제점은 결과를 삽입 할 열을 명시 적으로 언급하거나 쿼리 결과가 대상 테이블의 구조와 일치해야한다는 점입니다. 예를 들어

,의를하자 :

DECLARE @Table_1 TABLE (Field_1 NVARCHAR(512) , 
         Field_2 NVARCHAR(512) , 
         Field_3 NVARCHAR(512) , 
         Field_4 NVARCHAR(512) , 
         Field_5 NVARCHAR(512) , 
         Field_6 NVARCHAR(512) ) ; 

과 같은 쿼리 : 이제

DECLARE @_My_Query NVARCHAR(1000) = ' 
SELECT Name Field_1 , 
     Street Field_2 , 
     Phone Field_3 
FROM My_Table 
'; 

을, 나는 할 수 없습니다

INSERT INTO @Table_1 
    EXECUTE sp_executesql @_My_Query ; 

을가 불일치에 대해 불평 때문에 열. (Field_1,Field_2,Field_3)도 다른 쿼리가 다른 수의 열을 필요로하기 때문에 하드 코딩 할 수 없습니다.

모든 제안을 매우 높이 평가하겠습니다.

편집 : KrazzyNefarious, 제론 Mostert 및 Damien_The_Unbeliever에 의해 게시 된 의견에 답변 :

내가 쿼리뿐만 아니라 계산에 의해 반환 된 필드의 밝은 전망을 가지고 않습니다.

  1. 내가 열 및 내용의 변수 번호 CSV 파일의 생성을 지원한다 일하고 있어요 시스템을 다음과 같이

    내가 구현하기 위해 노력하고있어 기능입니다.

  2. 결과 데이터를 생성하는 쿼리는 결과의 모든 열을 설명하는 테이블과 함께 상위 계층에서 준비되고 저장 프로 시저 (문자열로)로 전송됩니다 (예 : 서수 위치, 필드 이름, 데이터 유형, Excel 첫 행의 제목 등).

  3. 내가 처리하고있는 절차는 쿼리 문자열을 취하여 결합 된 INSERT INTO Table_1 EXECUTE sp_executesql @_My_Query을 실행합니다. 이 작업이 완료되면 각 필드를 검사하는 메커니즘 (예 : 필요할 때마다 "을 추가)은 데이터의 출처에 대한 염려없이 Table_1의 내용을 처리 할 수 ​​있습니다.

나는 접근 방식의 추함 게다가, 성능 및 추가 문제에 영향을 미치는, 이후 임시 테이블을 사용하지 않도록하는 것을 선호 (사용, 충돌 등 후 기록을 삭제해야합니다).

+0

동적 쿼리가 반환 할 수있는 최대 열 수는 얼마입니까? – KrazzyNefarious

+0

필드를 매핑하는 방법을 어떻게 알고 있습니까? 적어도 그 이름은 서신에 맞습니까? –

+0

"... 동적 선택이 내장 된 문자열이 있습니다."- 추가 된 열의 수를 추적 할 수 있도록 * 해당 문자열을 구성하는 프로세스를 변경할 수 있습니까? 질의 텍스트가 포함 된 문자열에서부터 시작하여 열 수를 결정하기 위해 구문 분석을 시도하면 너무 복잡한 것처럼 보입니다. –

답변

-1

이 :

내가 열 및 내용의 변수 번호 CSV 파일의 생성을 지원한다 일하고 있어요 시스템.

은 문제의 핵심입니다. 이 요구 사항을 실제로 지원/지원하지 않는 경로를 선택했습니다. 당신은 임시 테이블을 배제했습니다. 따라서 유일한 다른 옵션은 각 수출 "상황"에 대해 (임시 또는 영구) 테이블을 만드는 것입니다.이 테이블은 추악하고 많은 다른 문제에 취약합니다. rdbms의 테이블은 고정 된 구조를 가지고 있기 때문에. 다른 수의 열뿐 아니라 다른 데이터 유형을 고려해야합니다. 그 문제를 무시하고 있습니까? 아니면 매우 단순화 된 가정을 했습니까? 한 가지 상황 만 보게되면 종종 직면하는 복잡성을 놓치게됩니다.

또한 저장 프로 시저 (또는 스크립트)에서 CSV 데이터를 내보내는 것에 대한 많은 토론을 검색 할 수 있습니다. 이는 소스 데이터 구조의 가변성이 없어도 문제 및 제약 사항의 중첩에 불과합니다.

잘못된 도구를 사용하여 요구 사항을 구현하는 것이 좋습니다. TSQL은 단순히 ETL을 지원하지 않으며 의도하지 않습니다. 이 길로 내려 가려는 경우 몇 가지 고급 기술이 필요합니다.

+0

당신의 게시물에 대해 감사합니다. 비록 어떤 도움이되는지를 실제로 볼 수는 없지만. 일부 의견 : (1) 질문을 게시하는 사람은 자신이 말하는 것에 대해 기본적으로 약간의 이해가 있다고 가정하면 유용합니다 (항상 사실은 아니지만 출발점으로 좋습니다). (2) 수천 개의 서로 다른 결과 구조와 많은 사용자들이 동시에 충돌 할 가능성이있는 임시 테이블 또는 영구 테이블 옵션을 만들 것이라고 평가하는 것이 타당합니다. (3) 고급 기술 : 글쎄, 나는 해결책을 찾았다 고 생각한다. 그것을 올리면 판사가됩니다. – FDavidov