他のテーブルから動的に挿入しようとしている場合は、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.
も動的に生成するFK列ですか?または生成時に知られていますか?とにかく、select(1つの結果の行に1つの挿入)から文字列としてステートメントを生成し、sp_executesqlを使用して生成された文字列を実行することができます。それは達成したいことですか? –
動的SQLを使用する理由はありますか?私はあなたがそれなしでこれを行うことができると思います。 – Yatrix
たとえば、私が選択している場合: 'SELECT ID、名前、CountryId From CreatedAt BETWEEN '2016-01-25 00:00:00' AND '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、Claudia、46) INSERT INTO Person 45) ' FKが見つかりました。 –