我在数据库中有一个主表。
示例菜单表
+-----------+-----------+-------------+---------+------------------------+
| Id | Key | Display Text| ParentId| CreatedOn
+-----------+-----------+-------------+---------+------------------------+
| 1 | Home | Home | NULL |2014-01-14 21:17:37.387 |
| 2 | About | About Us | NULL |2014-01-14 21:17:37.387 |
| 3 | Contact | Contact Us | NULL |2014-01-14 21:17:37.387 |
+-----------+-----------+------+------+---------+------------------------+
我曾为每个记录生成以下类似的主数据脚本。
IF NOT EXISTS(SELECT 1 FROM [Menu] WHERE Id=1 AND Key='Home')
BEGIN
SET IDENTITY_INSERT [dbo].[Menu] ON
INSERT INTO [dbo].[Menu]
(Id
,[Key]
,[DisplayText]
,[ParentId]
,[CreatedOn])
VALUES
(1
,'Home'
,'Home'
,NULL
,GETDATE()
)
SET IDENTITY_INSERT [dbo].[Menu] OFF
END
GO
-- 重复手动创建70条记录和其他主数据的工作(10k行
)
但是,另一个数据库中存在一些现有的表ApplicationMenu
具有相同的列,数据类型。我们希望通过使用某些存储过程自动生成以下脚本。
是否可以创建如下存储过程?
CREATE PROCEDURE spGenerateInsertScripts
(
@SourceTableName VARCHAR(100),
@ExistsWhereClauseTemplate NVARCHAR(1000),
@TargetTableName VARCHAR(100)
)
BEGIN
-- In some loop create those above insert statements
END
我们希望执行以下操作。
exec spGenerateInsertScripts 'ApplicationMenu'
, 'WHERE Id={Id} AND Key={Key}'
, 'Menu'
在此,将从现有表中的每一行读取{Id} & {Key} 并进行替换。
这实际上会减少我们很多手动工作。
注意:
我们无法使用 SQL Server 插入脚本生成工具,因为我们想要检查数据是否存在,并且需要保留由用户使用我们的应用程序添加的记录。
需要生成插入脚本,以便将来可以直接运行,即使 ApplicationTable 不可用也可以运行。
是否可能编写这样的过程,以根据现有情况从其他表生成插入脚本?就像 SQL Server 的 Generate Scripts 通过查看 INFORMATION_SCHEMA 表创建表,期望使用相同的方法。
最终过程的输出结果将如PRINT @insert_Sql_Statements