2015-04-22 37 views
1

我创建了一个脚本插入到一个表作为使用任务如下 - >生成脚本生成插入脚本如果NOT EXISTS

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或任何其他工具 我想这个TI保存为单个.sql文件并传送到客户端的任何方式。

+0

要做到这一点,您需要定义什么是“匹配键”来决定记录是否存在。我通常使用公式和东西在Excel中构建这些脚本,但现在可能有一种更明智的方法。如果它不一定是一个独立的脚本,你可以用SSIS或INSERT/SELECT来做到这一点 –

+0

哦......另一种方式是使用MERGE,合并的源头是一串SELECT UNION声明。你可以使用正确的**版本的SQL Server更新标签吗?所以我们可以建议合适的解决方案? –

+0

感谢您的回复...我已经编辑了标签,并会尝试合并.. –

回答

2

这个答案是基于你有一个你想要的预生成脚本。达到此基础上,你有一个脚本

一种方法是INSERT值成#TEMP表,然后INSERT到使用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') 

这会给你一个包含所有你想INSERT记录,如果他们不已经存在的#temp表。

一旦创建该表,然后你可以像这样执行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 
2

可以使用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]);