2017-03-06 6 views
3

SQL의 저장 프로 시저에서 동적 INSERT 스크립트를 만드는 방법이 있습니까?SQL의 동적 INSERT 스크립트

날짜 범위를 선택하고 해당 범위의 모든 행에 대한 INSERT 문을 작성하고 이러한 "종속성"테이블에 대해 계단식 INSERT 스크립트를 생성하는 모든 외래 키를 탐색해야하는 아카이브 기능을 생성하도록 요청 받았습니다. .

가능한가요? 나는 이것에 관해 연구하고 있었고 아무것도 찾을 수 없었다.

+0

동적 생성을위한 FK 열은 무엇입니까? 또는 생성 시간에 알려져 있습니까? 어쨌든, 당신은 select (하나의 결과에서 한 행에 하나의 삽입)에서 문자열로 구문을 생성 한 다음 sp_executesql을 사용하여 생성 된 문자열을 실행할 수 있습니다. 그것이 당신이 달성하기를 원하는 것입니까? –

+0

동적 SQL을 사용하는 이유가 있습니까? 나는 당신이 그것없이 그것을 할 수 있다고 생각합니다. – Yatrix

+0

예를 들어, 내가 선택한 경우 : 'SELECT ID, 이름, CountryId 사람 사이에서 만든 사람 '2016-01-25 00:00:00'및 '2016-12-25 23 : 59 : 59'' 생성 된 스크립트는해야한다 : 'INSERT INTO 국가 (ID, 이름) VALUES (45, '이탈리아') INSERT INTO 국가 (ID, 이름) VALUES (46, '프랑스') INSERT INTO 사람 (ID, 이름, CountryId) VALUES (34, John, 45) INSERT INTO Person (ID, 이름, CountryId) VALUES (35, 클라우디아, 46) INSERT INTO Person 45)' FK에 대해서도 마찬가지입니다. –

답변

0

다른 테이블의 삽입을 동적으로 수행하려는 경우 INSERT 및 SELECT 문의 조합으로이 작업을 수행 할 수 있습니다. 이것이 당신이 무엇인지 확신 할 수 없습니다.

예컨대 :

INSERT INTO Person_Archive(Id,Name, CountryId) 
     SELECT Id, Name, CountryId FROM Person 
     WHERE CreatedAt BETWEEN '2016-01-25 00:00:00' AND '2016-12-25 23:59:59' 

이 하나 어렵습니다. 아카이브에 존재하지 않는 국가 만 추가하려고합니다. 물론 여기서 고양이를 피하는 더 많은 방법이 있습니다. 이것은 접근법을 분명히 말하고있는 것입니다.

INSERT INTO Country_Archive(Id, Name) -- INSERT INTO THE archive 
SELECT Country.CountryId, Country.Name FROM Person -- SELECT rows 
JOIN Country ON CountryID.Id = Person.CountryId -- Join on Country to get Country Name 
WHERE CreatedAt BETWEEN '2016-01-25 00:00:00' AND '2016-12-25 23:59:59' 
-- Criteria for query 
AND (SELECT COUNT(*) FROM Country_Archive WHERE Country_Archive.Id = Person.CountryID) = 0) 
-- This checks to see if CountryId hasn't already been added 
GROUP BY Country.CountryId, Country.Name -- This get unique records only, i.e. if multiple users have same country.