将 SQL 视图结果集插入 SQL Server 表中

问题描述 投票:0回答:2

我想通过链接服务器将视图的结果集插入到SQL Server表中。该视图通常会获取超过 20,000 行。

我想每天通过任务计划程序中的批处理程序调用视图。

由于视图没有像 ID 这样的主键,我想知道如何只插入不存在的记录,而不是每天删除整个表并每天插入全部 20,000 条记录。

任何帮助将不胜感激。

我可以通过链接服务器将视图中的所有行插入数据库,但不知道如何只插入不存在的记录。

下面是我的代码

TRUNCATE TABLE [TABLE1].[dbo].[TableData]

WAITFOR DELAY '000:00:01'

INSERT INTO [TABLE1].[dbo].[TableData]
    SELECT *
    FROM [SourceServer].[SourceDatabase].[dbo].[VW_View]
sql-server performance view database-design duplicates
2个回答
0
投票

你可以这样做:

insert into yourtable(c1, c2, c3, c4)
select t1.c1, t1.c2, t1.c3, t1.c4
from (select 'abc' as c1, 'def' as c2, 35 as c3, 3.14 as c4) t1
left join yourtable t2
on t1.c1 = t2.c1 and
   t1.c2 = t2.c2 and
   t1.c3 = t2.c3 and
   t1.c4 = t2.c4
where t2.c2 is null

我们基本上选择我们想要的所有值,将它们别名为单行表 t1,将其与您的表左连接以查找匹配项(如果存在),如果不匹配则继续插入记录。

当然,你可以

union
批量放入
t1
以减少命令数量。


-1
投票

下面的查询可能会帮助您解决您的问题:

DECLARE @sql NVARCHAR(MAX);

-- Build the dynamic SQL statement
SET @sql = '
MERGE INTO YourDestinationTable AS target
USING (
    SELECT * FROM YourLinkedServer.YourDatabase.YourSchema.YourView
) AS source
ON target.ColumnName = source.ColumnName -- Use appropriate column(s) for comparison
WHEN NOT MATCHED THEN
    INSERT (Column1, Column2, ..., ColumnN) -- List all columns you want to insert
    VALUES (source.Column1, source.Column2, ..., source.ColumnN); -- Values from the source view
';

-- Execute the dynamic SQL
EXEC(@sql);
© www.soinside.com 2019 - 2024. All rights reserved.