3
有沒有辦法從SQL中的存儲過程創建動態INSERT腳本?SQL中的動態INSERT腳本
我被要求創建一個歸檔功能,它應該選擇一個日期範圍並創建該範圍所有行的INSERT語句,並瀏覽所有爲這些「依賴」表生成級聯INSERT腳本的外鍵。
這可能嗎?我正在研究這件事,但找不到任何東西。
有沒有辦法從SQL中的存儲過程創建動態INSERT腳本?SQL中的動態INSERT腳本
我被要求創建一個歸檔功能,它應該選擇一個日期範圍並創建該範圍所有行的INSERT語句,並瀏覽所有爲這些「依賴」表生成級聯INSERT腳本的外鍵。
這可能嗎?我正在研究這件事,但找不到任何東西。
如果您試圖從其他表中動態插入數據,則可以使用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列?或在世代時已知?無論如何,您可以從選擇中產生一個字符串(結果中每行插入一個),然後使用sp_executesql執行生成的字符串。那是你想要達到的目標嗎? –
你是否有理由使用動態sql?我想你可以沒有它做到這一點。 – Yatrix
例如,如果我選擇: 'SELECT Id,Name,CountryId FROM Person WHERE 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,Name,CountryId)VALUES(34,John,45) INSERT INTO Person(Id,Name,CountryId)VALUES(35,Claudia,46) INSERT INTO Person(Id,Name,CountryId)VALUES(36,Andrew, 45)' 等等找到任何FK。 –