Параметр XML для распределенного запроса - разница между SQL 2005 и SQL 2012

dba.stackexchange https://dba.stackexchange.com/questions/102024

Вопрос

Я унаследовал старую корпорацию SQL2005 Enterprise (в Windows 2003), которая позволяет параметрам XML к распределенному запросу, такого как:

exec sp_executesql 'exec [server].[database].dbo.sproc @Id=@Id,@PItems=@PItems output','@PId bigint, @PItems xml output', valueOf@PId, valueOf@PItems output
.

Это больше не работает в SQL2012, ошибка говорит:

MSG 9512, уровень 16, состояние 1, линия 1 XML Тип данных не поддерживается как параметр для удаленных вызовов.

Мой вопрос: есть ли разрешение или тикбл (FACET?), чтобы разрешить параметрами XML для распределенных запросов или 2012 года больше не поддерживают его?

Примечание. Таблицы не имеют никаких столбцов DataType XML.Только параметр - XML.

Это было полезно?

Решение 2

Я нашел решение моей проблемы.Мое «имя сервера» часть хранимой процедуры была загружена из столбца в базе данных, которая включала номер порта (потому что это именованный экземпляр), поэтому он прочитал

[Servername\Instance,Port].[database]....
.

Но когда я удалил порт, он работал.Демонстрация ниже.

USE [master]
GO

CREATE DATABASE TestDatabase
go

ALTER DATABASE TestDatabase SET COMPATIBILITY_LEVEL = 90
GO

USE [TestDatabase]
go

CREATE TABLE [Table_A]([MyColumn] [varchar](100) NOT NULL)
go

INSERT INTO Table_A (MyColumn)
VALUES ('this is some text')
go


CREATE PROCEDURE [dbo].[GetSomeText] 
    @P_XmlParameter xml output
AS
BEGIN
    SET  @P_XmlParameter = (SELECT  MyColumn
                            FROM Table_A                                
                            FOR XML RAW('xmlrow'), ROOT('xmldoc'))
END
GO


CREATE PROCEDURE [dbo].[CallDistributedSproc] 
    @XmlParam xml output
AS
BEGIN

    declare @sql nvarchar(2000)
    declare @sqlparam nvarchar(2000)

    set @Sql = 'exec [' + @@SERVERNAME + '].[TestDatabase].dbo.GetSomeText @P_XmlParameter=@XmlParam output'

    set @SqlParam = '@XmlParam xml output'

    print @sql

    exec sp_executesql @Sql, @SqlParam, @XmlParam output
END
GO


declare @XmlParam xml
set @XmlParam= null
exec CallDistributedSproc @XmlParam=@XmlParam output
select @XmlParam
.

Другие советы

Это не поддерживается, но вы можете обойти его ..

select * from openquery(
 LinkedServerName,
 'exec [database].dbo.sproc @Id=@Id,
                       @PItems=@PItems output'',''
                       @PId bigint, 
                       @PItems xml output'', 
                       valueOf@PId, 
                       valueOf@PItems output'
)
.

Есть много ловушек.которые хорошо Объяснены здесь , как вы находитесь в 2012 году, вы захотите посмотреть на выполнение удаленного запросас наборами результатов.некоторая версия этого.

SELECT * FROM OPENQUERY(LinkedServerName, 
          'EXEC msdb..sp_helpindex sysjobs
           WITH RESULT SETS ((index_name        sysname,
                              index_description nvarchar(500),
                              index_keys        nvarchar(500)))')
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top