2017-10-05 148 views
0

我有几张表,我想在使用OPENQUERY的链接服务器中创建。如何使用OPENQUERY在链接表中创建表?

基本上,我有一个查询填充链接服务器(ServerB)上运行的表(TableA)。我正致力于从其他服务器(ServerB)作为链接服务器运行此查询的方式。

所以我有ServerA在那里我试图运行这个查询,但查询结果太长,所以我不得不缩短它,并分解成约8个不同的查询。为此,为了工作,我需要将每个分解查询的结果放入表格中(表格1,表格2等)。完成后,我将删除这些表格,因为只有当此查询从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; 

这给我的错误:

Server 'SQLINFWWDVP07' is not configured for RPC.

我已经试过这样:

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));'') ') 

这给我的错误:

Cannot process the object " (Then the whole of the query) The OLE DB provider "SQLNCLI11" for linked server "SQLINFWWDVP07" indicates that either the object has no columns or the current user does not have permissions on that object.

所以我会再试试这个:

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') 

这使我没有错误,而且在连接服务器(服务器B)不创建表。

我也试了两种方式,但没有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来创建表,但会得到与最后两个例子相同的结果。

回答

1

你可以尝试使用EXEC ... AT

EXEC ('create table tempdb.dbo.t(id int)') At [192.1.1.2] 

对于RPC错误。您可以启用RPC OUT

enter image description here

+0

我只是想,虽然我不得不使用的服务器名称,因为IP只是说,它无法找到,在链接的服务器列表。我收到了与上面第一个示例中相同的错误消息:'服务器'SQLINFWWDVP07'未配置为RPC。' – Mike

+1

@Mike,对于RPC错误,您只需启用RPC OUT,否则无法写入远程服务器 –

+0

完美,工作! – Mike