我使用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文件并发送给客户端。
答案 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
将#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')
。所以你的陈述都是这样的:
#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}}