SQL Server 2016链接2019实例:查询正常但无法插入临时表
SQL Server跨版本链接服务器插入临时表问题
版本信息
SQL Server 2016版本:
Microsoft SQL Server 2016 (SP3) (KB5003279) - 13.0.6300.2 (X64) Aug 7 2021 01:20:37 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows Server 2019 Standard 10.0 <X64> (Build 17763: )
SQL Server 2019版本:
Microsoft SQL Server 2019 (RTM-CU16) (KB5011644) - 15.0.4223.1 (X64) Apr 11 2022 16:24:07 Copyright (C) 2019 Microsoft Corporation Standard Edition (64-bit) on Windows Server 2019 Standard 10.0 <X64> (Build 17763: )
问题场景与现象
- 有多台SQL Server 2016和2019实例,需汇总所有服务器数据生成报表,通过一台服务器以链接服务器方式连接其他实例执行查询。
- 此前仅2016实例间操作正常,跨2016到2019时出现问题。
- 最初使用
OPENQUERY执行查询,跨版本场景下无法工作;修改为通过EXEC [LinkedServerSQL2019].msdb..sp_executesql执行查询后,从2016实例执行可正常返回结果:
EXEC [LinkedServerSQL2019].msdb..sp_executesql N'SELECT top 10 event_time, action_id, succeeded, class_type, server_principal_name,target_database_principal_name, database_name, object_name, statement, additional_information,t.host_name, program_name FROM [sys].[fn_get_audit_file] ( ''FilePath*.sqlaudit'', NULL, NULL ) t LEFT JOIN sys.dm_exec_sessions e ON e.session_id=t.session_id AND e.login_name = t.server_principal_name WHERE [event_time] >= dateadd(day,-1,GETUTCDATE()) AND succeeded = 1 AND action_id = ''LGIS'' ';
- 但尝试将结果插入2016本地临时表时操作失败:
-- 临时表创建于SQL Server 2016实例 CREATE TABLE #TempDump ( event_time datetime, action_id varchar(100), succeeded bit, class_type varchar(10), server_principal_name nvarchar(max), target_database_principal_name nvarchar(max), database_name varchar(max), object_name varchar(max), statement varchar(max), additional_information varchar(max), host_name varchar(max), program_name varchar(max) ) INSERT INTO #TempDump EXEC [LinkedServerSQL2019].msdb..sp_executesql N'SELECT top 10 event_time, action_id, succeeded, class_type, server_principal_name,target_database_principal_name, database_name, object_name, statement, additional_information,t.host_name, program_name FROM [sys].[fn_get_audit_file] ( ''FilePath*.sqlaudit'', NULL, NULL ) t left join sys.dm_exec_sessions e on e.session_id=t.session_id and e.login_name=t.server_principal_name WHERE [event_time] >= dateadd(day,-1,GETUTCDATE()) and succeeded=1 and action_id=''LGIS'' ';
- 执行上述插入语句触发错误(错误信息见截图),无法理解为何单独查询正常,但插入临时表失效?该操作在2016实例间可正常完成,仅跨版本时出现问题,求解决思路。
内容的提问来源于stack exchange,提问作者Danielle Paquette-Harvey
相关产品推荐
相关产品推荐

