2010-02-01 2 views
1

나는 내 제목이 정확히 말로 잘 표현되어 있지 않다는 것을 안다. SQL Server 2005 Express를 사용하고 있습니다.한 테이블의 모든 필드를 다른 SQL Server 2005 Express의 더 넓은 테이블로 복사하는 방법은 무엇입니까?

기본적으로 "템플릿"을 저장하는 테이블이 있습니다. 예를 들어 자동차를 사용하여 필드 같은 것 : 지금

TemplateID 
Color 
Make 
Model 

을, 나는 템플릿의 "인스턴스"를 나타내는 다른 테이블이있다. 그것은 모든 템플릿 테이블의 필드 플러스 인스턴스에 고유 한 몇 가지 필드가 포함

InstanceID 
VIN 
SerialNumber 
Color 
Make 
Model 

나는 "인스턴스"테이블에 새 행을 삽입하는 저장 프로 시저를 쓰고 있어요. 이 저장 프로시 저는 "VIN"및 "SerialNumber"에 대한 입력 매개 변수를 사용하지만 해당 "Template"에서 "Color", "Make"및 "Model"을 복사하려고합니다. 템플리트는 이미 알려진 "TemplateID"로 위치합니다.

이 저장 프로 시저를 작성하는 방법에 대한 조언을 찾고 있습니다.

INSERT INTO Instance(VIN, SerialNumber, "EverythingElse") 
VALUES (@VIN, @SerialNumber, SELECT * FROM Template WHERE TemplateID = 1) 

: 그것은이 테이블은 100 개 이상의 필드를 (. 내가 그들을 디자인하지 않았지만, 내가 그들을 사용 붙어있어) 내가 좋아하는 뭔가를하고 싶은 포함되어 있다는 사실이 없었다면 그것은 간단 할 것 즉, "템플릿"에 저장되지 않은 필드를 매개 변수를 통해 제공하고 템플릿의 다른 모든 필드 만 복사하려고합니다. 모든 분야에서 손으로 코딩하지 않으면 이런 일이 가능합니까?

답변

0

INSERT INTO를 수행하고 values ​​문 대신 SELECT 문을 사용하십시오.

INSERT INTO Instance(VIN, SerialNumber, a, b, c) 
SELECT @VIN, @SerialNumber, a, b, c FROM Template WHERE TemplateID = 1; 

정말 *을 사용하고 싶지 않습니다. SQL Server Managemnt Studio 스크립트에서 SELECT 문을 사용할 수 있으며 입력 할 필요가 없도록 필드 이름을 생성합니다. 이 같은 동적 SQL을 사용할 수 있습니다 그리고

+0

이 유일한 문제는 내가 100 + 필드 이름을 가질 것입니다 (A, B, C, .......) . 나는 그렇게 긴 쿼리를 만드는 것을 피하려고 노력하고있다. 나는 그것이 가능하지 않을지도 모른다는 것을 깨닫는다. 그러나 더 좋은 방법이 있는지를 물어볼 것이라고 생각했다. –

+0

다른 답변을 참조하십시오. – ctrlShiftBryan

+0

왜 100 개의 열 이름에 반대하겠습니까? It is itis itis itisi, itisi입니다. 개인적으로 나는 d = code를 작성할 때 객체 oexporer에서 그것들을 드래그 앤 드롭하지만, 그것은 나뿐입니다. 이것은 동적 인 위의 해답입니다. – HLGEM

1

은 ...

DECLARE 
    @Fields nvarchar(Max), 
    @SQL nvarchar(Max); 

SELECT 
    @Fields = COALESCE(@Fields + ',', '') + column_name 
FROM 
    information_schema.columns 
WHERE 
    table_schema = 'dbo' AND 
    table_name = 'Instance' AND 
    column_name <> 'PrimaryKeyID' --here you exclude columns 
ORDER BY 
    ordinal_position; 


SET @SQL = 'INSERT INTO dbo.Instance' 
    + ' (' 
    + @Fields 
    + ') SELECT ' 
    + ' (' 
    + @Fields 
    + ') FROM Template;'    

EXECUTE sp_executesql @SQL;