如果不存在则生成插入脚本

时间:2015-04-22 09:49:04

标签: sql sql-server sql-server-2012

我使用Task创建了一个用于插入表的脚本 - >生成脚本

GO
INSERT [USRPT].[Entity] ([DisplayName], [DataTableOrView], [PrimaryColumn], [BasedOn]) 
VALUES ( N'Resource Booking', N'exceViewRptResourceBooking rb', N'rb.BookingId', N'BOK')
GO
INSERT [USRPT].[Entity] ([DisplayName], [DataTableOrView], [PrimaryColumn], [BasedOn]) 
VALUES ( N'Freezed Contracts', N'exceViewRptFreeze fc', N'fc.FreezeItemId', N'FRZ')
GO
INSERT [USRPT].[Entity] ([DisplayName], [DataTableOrView], [PrimaryColumn], [BasedOn]) 
VALUES ( N'Article', N'exceViewRptArticle art', N'art.ArticleId', N'ATL')
GO

但是我想使用脚本工具(因为实际数据集很大)如下所示

GO
if not exists (select * from USRPT.Entity where DisplayName = 'Resource Booking')
begin
    INSERT [USRPT].[Entity] ([DisplayName], [DataTableOrView], [PrimaryColumn], [BasedOn]) 
    VALUES (N'Resource Booking', N'exceViewRptResourceBooking rb', N'rb.BookingId', N'BOK')
end

GO
if not exists (select * from USRPT.Entity where DisplayName = 'Freezed Contracts')
begin
    INSERT [USRPT].[Entity] ([DisplayName], [DataTableOrView], [PrimaryColumn], [BasedOn]) 
    VALUES (N'Freezed Contracts', N'exceViewRptFreeze fc', N'fc.FreezeItemId', N'FRZ')
end
GO
if not exists (select * from USRPT.Entity where DisplayName = 'Article')
begin
    INSERT [USRPT].[Entity] ([DisplayName], [DataTableOrView], [PrimaryColumn], [BasedOn]) 
    VALUES (N'Article', N'exceViewRptArticle art', N'art.ArticleId', N'ATL')
end

有没有办法使用SSMS或任何其他工具 我希望将此保存为单个.sql文件并发送给客户端。

2 个答案:

答案 0 :(得分:3)

您可以使用MERGE通过更新和插入行来修改实体表。   当源表中[DisplayName]的值与[DisplayName]中的值匹配时   目标表的列,(实体),所有列都在目标表中更新。   当[DisplayName]的值不匹配时,源行将插入目标表中。   源表是派生表,它使用Transact-SQL表值构造函数指定多个   源表的行。

DECLARE Entity TABLE ([DisplayName] nvarchar(200),
                              [DataTableOrView] nvarchar(200),
                              [PrimaryColumn] nvarchar(200),
                              [BasedOn] nvarchar(200)); 

INSERT into @Entity ([DisplayName], [DataTableOrView], [PrimaryColumn], [BasedOn]) 
VALUES ( N'Resource Booking', N'Test rb', N'Test', N'Test')

MERGE into Entity AS target     
    USING (VALUES (N'Resource Booking', N'exceViewRptResourceBooking rb', N'rb.BookingId', N'BOK'),
                  (N'Freezed Contracts', N'exceViewRptFreeze fc', N'fc.FreezeItemId', N'FRZ'),
                  (N'Article', N'exceViewRptArticle art', N'art.ArticleId', N'ATL'))
    AS source ([DisplayName], [DataTableOrView], [PrimaryColumn], [BasedOn])
    ON (target.[DisplayName] = source.[DisplayName])
    WHEN MATCHED THEN 
        UPDATE SET [DataTableOrView] = source.[DataTableOrView],
                   [PrimaryColumn] = source.[PrimaryColumn],
                   [BasedOn] = source.[BasedOn]
    WHEN NOT MATCHED THEN
    INSERT ([DisplayName], [DataTableOrView], [PrimaryColumn], [BasedOn])
    VALUES (source.[DisplayName], source.[DataTableOrView], source.[PrimaryColumn], source.[BasedOn] );

答案 1 :(得分:2)

这个答案是基于您想要使用的预生成脚本。

根据您拥有的脚本实现此目的的一种方法是使用INSERT#TEMPINSERT转换为NOT EXISTS表,然后CREATE TABLE #temp ([DisplayName] nvarchar(max), [DataTableOrView] nvarchar(max), [PrimaryColumn] nvarchar(max), [BasedOn] nvarchar(max)) 放入主表中子句。

首先在代码上面创建一个临时表:

[USRPT].[Entity]

然后对#temp的所有引用进行批量查找和替换,将其替换为INSERT #temp ([DisplayName], [DataTableOrView], [PrimaryColumn], [BasedOn]) VALUES ( N'Resource Booking', N'exceViewRptResourceBooking rb', N'rb.BookingId', N'BOK') 。所以你的陈述都是这样的:

#temp

这将为您提供一个INSERT表格,其中包含您想要INSERT的所有记录(如果它们尚不存在)。

创建该表后,您可以像这样对主表执行INSERT [USRPT].[Entity] ([DisplayName], [DataTableOrView], [PrimaryColumn], [BasedOn]) SELECT [DisplayName], [DataTableOrView], [PrimaryColumn], [BasedOn] FROM #temp WHERE NOT EXISTS ( SELECT DisplayName FROM [USRPT].[Entity] m WHERE m.DisplayName = #temp.DisplayName )

INSERT

所以CREATE TABLE #master ( val VARCHAR(10) ) INSERT INTO #master ( val ) VALUES ( 'abc' ), ( 'def' ), ( 'ghi' ), ( 'jkl' ), ( 'mno' ), ( 'pqr' ) SELECT val AS OriginalValues FROM #master CREATE TABLE #temp ( val VARCHAR(10) ) INSERT INTO #temp ( val ) VALUES ( 'abc' ), ( 'def' ), ( 'stu' ), ( 'xyz' ) SELECT val AS ValuesToBeInserted FROM #temp INSERT INTO #master ( val ) SELECT val FROM #temp WHERE NOT EXISTS ( SELECT val FROM #master m WHERE m.val = #temp.val ) SELECT val AS MergedValues FROM #master ORDER BY val DROP TABLE #master DROP TABLE #temp 记录还不存在。

您可以运行以进行测试的简化示例如下:

{{1}}