【发布时间】:2017-10-05 17:42:27
【问题描述】:
我有几个表要使用OPENQUERY 在链接服务器中创建。
基本上,我有一个查询来填充在链接服务器 (ServerB) 上运行的表 (TableA)。我正在研究一种从另一台服务器(ServerA)运行此查询的方法,该服务器将另一台(ServerB)作为链接服务器。
所以我有 ServerA 我试图在其中运行此查询,但查询最终太长了,所以我不得不缩短它并将其分成大约 8 个不同的查询。为此,为了工作,我需要将每个分解查询的结果放入表(Table1、Table2 等)中。完成后,我将删除这些表,因为只有在从 ServerA 运行此查询时才需要它们。
我浏览了互联网,试图找到一种我尝试过的方法:
DECLARE @table NVARCHAR(MAX), @sql NVARCHAR(MAX);
DECLARE @LinkedServerName nvarchar(100)
DECLARE @LinkedDbName nvarchar(100)
SET @LinkedServerName = 'SQLINFWWDVP07'
SET @LinkedDbName = 'Varasset'
SET @table = N'CREATE TABLE dbo.WOResults(id INT NULL);';
SET @sql = N'EXEC ' + QUOTENAME(@LinkedServerName) + N'.'
+ QUOTENAME(@LinkedDbName) + N'.sys.sp_executesql @table;';
EXEC sys.sp_executesql @sql, N'@table NVARCHAR(MAX)', @table;
这给了我错误:
没有为 RPC 配置服务器“SQLINFWWDVP07”。
我试过了:
SELECT * FROM OPENQUERY(SQLINFWWDVP07,'
exec (''create table [ext].[WOResults]([Id] uniqueidentifier,[AltWorkOrderId] nvarchar(50),[WORK ORDER STATUS] nvarchar(30),[DESCRIPTION] nvarchar(200),
[STATE] uniqueidentifier,[PROJ APVL] nvarchar(30),[EST COMP] nvarchar(30),[ACT COMP] nvarchar(30),[cd_M6OrderNo] nvarchar(50),[CDD Date] nvarchar(30),
[FinancialProject] uniqueidentifier,[AssignedLocation] uniqueidentifier,[PROJ TYPE] uniqueidentifier,[CLASS OF PLANT] uniqueidentifier,
[Justification Code] uniqueidentifier,[CLOSING NOTES] nvarchar(MAX),[READY FOR SERVICE EST] nvarchar(30),[READY FOR SERVICE ACT] nvarchar(30),
[EOJ] nvarchar(30),[AUDIT PICK] nvarchar(30),[AUDIT COMP] nvarchar(30),[AUDIT STATUS] nvarchar(100),[FullyReceivedDate] nvarchar(30),
[% MTL RECEIVED] decimal(18,5),[ASSIGNED USER] nvarchar(200),[WORK ORDER NOTES] nvarchar(MAX));'') ')
这给了我错误:
无法处理对象“(然后是整个查询)链接服务器“SQLINFWWDVP07”的 OLE DB 提供程序“SQLNCLI11”表示对象没有列或当前用户没有拥有该对象的权限。
所以我会试试这个:
SELECT * FROM OPENQUERY(SQLINFWWDVP07,'
exec (''create table [ext].[WOResults]([Id] uniqueidentifier,[AltWorkOrderId] nvarchar(50),[WORK ORDER STATUS] nvarchar(30),[DESCRIPTION] nvarchar(200),
[STATE] uniqueidentifier,[PROJ APVL] nvarchar(30),[EST COMP] nvarchar(30),[ACT COMP] nvarchar(30),[cd_M6OrderNo] nvarchar(50),[CDD Date] nvarchar(30),
[FinancialProject] uniqueidentifier,[AssignedLocation] uniqueidentifier,[PROJ TYPE] uniqueidentifier,[CLASS OF PLANT] uniqueidentifier,
[Justification Code] uniqueidentifier,[CLOSING NOTES] nvarchar(MAX),[READY FOR SERVICE EST] nvarchar(30),[READY FOR SERVICE ACT] nvarchar(30),
[EOJ] nvarchar(30),[AUDIT PICK] nvarchar(30),[AUDIT COMP] nvarchar(30),[AUDIT STATUS] nvarchar(100),[FullyReceivedDate] nvarchar(30),
[% MTL RECEIVED] decimal(18,5),[ASSIGNED USER] nvarchar(200),[WORK ORDER NOTES] nvarchar(MAX));'')
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ''ext'' AND TABLE_NAME = ''WOResults'')
BEGIN select ''Table Created'' END')
这没有给我任何错误,但也没有在链接服务器(ServerB)中创建表。
我也尝试了这两种方法,但没有像这样的exec:
SELECT * FROM OPENQUERY(SQLINFWWDVP07,'
create table [ext].[WOResults]([Id] uniqueidentifier,[AltWorkOrderId] nvarchar(50),[WORK ORDER STATUS] nvarchar(30),[DESCRIPTION] nvarchar(200),
[STATE] uniqueidentifier,[PROJ APVL] nvarchar(30),[EST COMP] nvarchar(30),[ACT COMP] nvarchar(30),[cd_M6OrderNo] nvarchar(50),[CDD Date] nvarchar(30),
[FinancialProject] uniqueidentifier,[AssignedLocation] uniqueidentifier,[PROJ TYPE] uniqueidentifier,[CLASS OF PLANT] uniqueidentifier,
[Justification Code] uniqueidentifier,[CLOSING NOTES] nvarchar(MAX),[READY FOR SERVICE EST] nvarchar(30),[READY FOR SERVICE ACT] nvarchar(30),
[EOJ] nvarchar(30),[AUDIT PICK] nvarchar(30),[AUDIT COMP] nvarchar(30),[AUDIT STATUS] nvarchar(100),[FullyReceivedDate] nvarchar(30),
[% MTL RECEIVED] decimal(18,5),[ASSIGNED USER] nvarchar(200),[WORK ORDER NOTES] nvarchar(MAX))
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ''ext'' AND TABLE_NAME = ''WOResults'')
BEGIN select ''Table Created'' END')
并得到相同的结果。
有没有办法使用OPENQUERY 在链接服务器中创建表?
我也尝试过使用select * into 创建表,但会得到与最后两个示例相同的结果。
【问题讨论】:
标签: sql-server linked-server openquery