Sql server SQL中的动态插入脚本
有没有办法从SQL中的存储过程创建动态插入脚本 我被要求创建一个归档功能,它应该选择一个日期范围,创建该范围内所有行的INSERT语句,并浏览所有外键,为那些“依赖项”表生成级联插入脚本Sql server SQL中的动态插入脚本,sql-server,insert,archive,procedure,Sql Server,Insert,Archive,Procedure,有没有办法从SQL中的存储过程创建动态插入脚本 我被要求创建一个归档功能,它应该选择一个日期范围,创建该范围内所有行的INSERT语句,并浏览所有外键,为那些“依赖项”表生成级联插入脚本 这有可能吗?我正在对此进行研究,但找不到任何结果。如果您试图从其他表中动态执行插入操作,则可以结合使用INSERT和SELECT语句。我不确定这是否是你想要的 例如: 这是最难的一个。您只想将不存在的国家/地区添加到存档中。当然,这里有更多的剥猫皮的方法,这只是阐明了方法 INSERT INTO Country
这有可能吗?我正在对此进行研究,但找不到任何结果。如果您试图从其他表中动态执行插入操作,则可以结合使用INSERT和SELECT语句。我不确定这是否是你想要的 例如: 这是最难的一个。您只想将不存在的国家/地区添加到存档中。当然,这里有更多的剥猫皮的方法,这只是阐明了方法
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列是否也要生成动态?还是在一代人的时候就知道了?无论如何,您可以从selects(结果中每行插入一个)生成一个字符串形式的语句,然后使用sp_executesql执行生成的字符串。这就是您想要实现的吗?是否有使用动态sql的原因?我想你可以不用它来做这件事。例如,如果我选择:
SELECT Id,Name,CountryId FROM Person WHERE CreatedAt FROM'2016-01-25 00:00:00'和'2016-12-25 23:59:59'
生成的脚本应该是:INSERT INTO Country(Id,Name)value(45,'意大利')INSERT INTO Country(Id,Name)value(46,'法国')插入个人(Id,姓名,CountryId)值(34,John,45)插入个人(Id,姓名,CountryId)值(35,Claudia,46)插入个人(Id,姓名,CountryId)值(36,Andrew,45)
,依此类推找到任何FK。可能吗?熟练地。写起来容易吗?不,容易维护吗?没有。你可以使用第三方工具为你存档数据吗?绝对是。值得花点时间写你自己的吗?可能不会。
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.