【问题标题】:How to create tables in a linked table using OPENQUERY?如何使用 OPENQUERY 在链接表中创建表?
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我刚试过,虽然我不得不使用服务器名称,因为 IP 只是说它在链接服务器列表中找不到它。我收到与上面第一个示例相同的错误消息:Server 'SQLINFWWDVP07' is not configured for RPC.
    • @Mike,对于RPC错误,只需要开启RPC OUT,否则无法写入远程服务器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多