sql - 使用 EXEC 的结果创建新表
问题描述
我正在尝试获取EXEC
查询结果并将它们放入我的 SQL Server 2017 数据库中的表中。
我知道以前曾问过类似的问题,例如此处、此处和此处,但我还没有找到可行的解决方案。
该EXEC
查询本身运行良好,并产生了我正在寻找的数据:
-- EXEC master.dbo.sp_serveroption @server=N'OLAP', @optname=N'rpc out', @optvalue=N'true'
DECLARE @sqlcode VARCHAR(MAX)
SET @sqlcode = 'code'
EXEC (@sqlcode) AT OLAP
OPENQUERY
由于 SQL 超过 8000 个字符限制,我无法使用。
尝试1:
DECLARE @sqlcode VARCHAR(MAX)
SET @sqlcode = 'sqlcode'
DROP TABLE IF EXISTS [jerry].[dbo].[purchases]
truncate table [jerry].[dbo].[purchases]
insert into [jerry].[dbo].[purchases]
exec ( @sqlcode ) at OLAP
但是得到:
找不到对象“购买”,因为它不存在或您没有权限。
尝试2:
SELECT * INTO [jerry].[dbo].[purchases] FROM OPENROWSET('EXEC (@sqlcode) AT OLAP')
但得到一个错误
')'` 附近的语法不正确。
尝试 3
CREATE TABLE [jerry].[dbo].[purchases] ([Transaction_Date] DATE, [Requirement_Date] DATE, [Element] NVARCHAR(256), [Trx_Quantity] NVARCHAR(256), [Part_Number] NVARCHAR(256), [NHA_Part_Number] NVARCHAR(256), [Group] NVARCHAR(256), [Details] NVARCHAR(256)); INSERT INTO [jerry].[dbo].[purchases] EXEC (@sqlcode) AT OLAP
但得到一个错误:
链接服务器“OLAP”的 OLE DB 提供程序“OraOLEDB.Oracle”返回消息“无法加入事务。”。消息 7391,级别 16,状态 2,行 208 无法执行操作,因为链接服务器“OLAP”的 OLE DB 提供程序“OraOLEDB.Oracle”无法开始分布式事务。
尝试 4
DECLARE @sqlcode VARCHAR(MAX)
SET @sqlcode = 'sql'
DROP TABLE IF EXISTS [jerry].[dbo].[report]
CREATE TABLE [jerry].[dbo].[report] ([Transaction_Date] DATE, [Requirement_Date] DATE, [Element] NVARCHAR(256), [Trx_Quantity] NVARCHAR(256), [Part_Number] NVARCHAR(256), [NHA_Part_Number] NVARCHAR(256), [Group] NVARCHAR(256), [Details] NVARCHAR(256));
insert into [jerry].[dbo].[report]
exec ( @sqlcode ) at OLAP
但我得到一个错误:
消息 7391,级别 16,状态 2,行 209 无法执行操作,因为链接服务器“OLAP”的 OLE DB 提供程序“OraOLEDB.Oracle”无法开始分布式事务。而且,当我尝试根据这篇文章更改“启用分布式事务的推广设置为 False”时,我收到另一个权限错误。
简而言之,我只需要EXEC
输入 SQL Server 数据库的第一个查询的结果。该EXEC
查询确实命中了我只有读取权限且无法更改任何安全设置的外部 Oracle 数据库。
任何帮助表示赞赏。
解决方案
根据评论,特别是来自@Larnu
DECLARE @sqlcode VARCHAR(MAX)
SET @sqlcode = 'sqlcode'
DROP TABLE IF EXISTS [jerry].[dbo].[purchases]
truncate table [jerry].[dbo].[purchases]
insert into [jerry].[dbo].[purchases]
exec ( @sqlcode ) at OLAP
几乎是正确的,但需要切换到
DECLARE @sqlcode VARCHAR(MAX)
SET @sqlcode = 'sqlcode'
truncate table [jerry].[dbo].[purchases]
insert into [jerry].[dbo].[purchases]
exec ( @sqlcode ) at OLAP
因为我不能删除一个表,然后在不重新创建它的情况下对其执行任何操作。
推荐阅读
- mysql - 为什么这个查询在mysql中返回一个空集
- c++ - 如何将 std::string 分配回 std::vector
.data() 作为 void* 指针传递? - calendar - Control-M 日历 - 是否可以在未选择日期的日历上设置作业运行
- javascript - 使用spring mvc在按钮单击时获取异步视图数据
- c# - HttpClientFactory如何注入类我无法控制核心2.1
- php - 将会话从 PHP 转换为 NodeJS - JSON 输入意外结束
- javascript - 打字稿:读取节点js中的类装饰器文件
- javascript - 传递的函数不适用于 jquery 代码
- java - @Transactional 注解 Spring boot 2.0 和休眠 LazyInitializationException
- c - 当我返回 2 个结构时,程序收到信号 SIGTRAP