我想通过链接服务器将视图的结果集插入到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]
你可以这样做:
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
以减少命令数量。
下面的查询可能会帮助您解决您的问题:
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);