2017-03-06 6 views
3

SQLのストアドプロシージャから動的INSERTスクリプトを作成する方法はありますか?SQLの動的INSERTスクリプト

日付範囲を選択し、その範囲のすべての行のINSERT文を作成し、これらの「依存関係」テーブルのカスケードINSERTスクリプトを生成するすべての外部キーをナビゲートするアーカイブ機能を作成するように求められました。

これは可能でしょうか?私はこれについて研究していて何も見つけることができませんでした。

+0

も動的に生成するFK列ですか?または生成時に知られていますか?とにかく、select(1つの結果の行に1つの挿入)から文字列としてステートメントを生成し、sp_executesqlを使用して生成された文字列を実行することができます。それは達成したいことですか? –

+0

動的SQLを使用する理由はありますか?私はあなたがそれなしでこれを行うことができると思います。 – Yatrix

+0

たとえば、私が選択している場合: '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が見つかりました。 –

答えて

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.