매우 복잡한 CTE가 있으며 결과를 실제 테이블에 삽입하고 싶습니다.
다음이 유효합니까?
INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos
(
BatchID,
AccountNo,
APartyNo,
SourceRowID
)
WITH tab (
-- some query
)
SELECT * FROM tab
재사용 할 수있는이 CTE를 작성하는 기능을 사용하려고합니다. 이견있는 사람?
답변
CTE를 먼저 넣고 INSERT INTO를 select 문과 결합해야합니다. 또한 CTE 이름 뒤에 나오는 “AS”키워드는 선택 사항이 아닙니다.
WITH tab AS (
bla bla
)
INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos (
BatchID,
AccountNo,
APartyNo,
SourceRowID
)
SELECT * FROM tab
이 코드는 CTE가 정확히 4 개의 필드를 반환하고 해당 필드가 INSERT 문에 지정된 순서와 유형으로 일치한다고 가정합니다. 그렇지 않은 경우 “SELECT *”를 원하는 필드 선택으로 바꾸십시오.
함수 사용에 대한 귀하의 질문에 대해서는 “의존합니다”라고 말할 것입니다. 성능상의 이유로 인해 데이터를 테이블에 저장하고 함수를 통해 데이터를 사용할 때 속도가 허용되는 경우 함수를 옵션으로 간주합니다. 반면에 CTE 결과를 여러 다른 쿼리에 사용해야하고 속도가 이미 문제 인 경우 테이블 (정규 또는 임시)을 사용합니다.
WITH common_table_expression (Transact-SQL)
답변
WITH
공통 테이블 식에 대한 절은 상단에 이동합니다.
CTE의 모든 삽입을 래핑하면 쿼리 매핑을 열 매핑에서 시각적으로 분리 할 수 있다는 이점이 있습니다.
실수를 찾아 내십시오 :
WITH _INSERT_ AS (
SELECT
[BatchID] = blah
,[APartyNo] = blahblah
,[SourceRowID] = blahblahblah
FROM Table1 AS t1
)
INSERT Table2
([BatchID], [SourceRowID], [APartyNo])
SELECT [BatchID], [APartyNo], [SourceRowID]
FROM _INSERT_
같은 실수:
INSERT Table2 (
[BatchID]
,[SourceRowID]
,[APartyNo]
)
SELECT
[BatchID] = blah
,[APartyNo] = blahblah
,[SourceRowID] = blahblahblah
FROM Table1 AS t1
몇 줄의 상용 구판을 사용하면 매우 많은 수의 열이 있어도 코드가 올바른 수의 열을 올바른 순서로 삽입하는지 확인할 수 있습니다. 미래의 자기 자신은 나중에 감사합니다.
답변
네:
WITH tab (
bla bla
)
INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos ( BatchID, AccountNo,
APartyNo,
SourceRowID)
SELECT * FROM tab
이것은 여러 CTE를 지원하는 SQL Server 용입니다.
WITH x AS (), y AS () INSERT INTO z (a, b, c) SELECT a, b, c FROM y
Teradata는 하나의 CTE 만 허용하며 구문은 예제입니다.