parâmetro xml para consulta distribuída - diferença entre SQL2005 e SQL2012
-
26-09-2020 - |
Pergunta
Herdei um antigo banco de dados SQL2005 Enterprise (no Windows 2003) que permite um parâmetro xml para uma consulta distribuída como esta:
exec sp_executesql 'exec [server].[database].dbo.sproc @Id=@Id,@PItems=@PItems output','@PId bigint, @PItems xml output', valueOf@PId, valueOf@PItems output
Isso não funciona mais no SQL2012, o erro diz:
Msg 9512, Nível 16, Estado 1, Linha 1 Tipo de dados Xml não é suportado como um parâmetro para chamadas remotas.
Minha pergunta:existe uma permissão ou caixa de seleção (faceta?) para permitir parâmetros xml para consultas distribuídas ou 2012 não oferece mais suporte para isso?
Observação:as tabelas não possuem colunas do tipo de dados xml.Apenas o parâmetro é xml.
Solução 2
Eu encontrei a solução para o meu problema.Minha parte "nome do servidor" do procedimento armazenado estava sendo carregada de uma coluna no banco de dados que incluía o número da porta (porque é uma instância nomeada), portanto, ele leu
[Servername\Instance,Port].[database]....
mas quando removi a porta funcionou.Demonstração abaixo.
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
Outras dicas
Não é compatível, mas você pode contornar isso.
select * from openquery( LinkedServerName, 'exec [database].dbo.sproc @Id=@Id, @PItems=@PItems output'','' @PId bigint, @PItems xml output'', valueOf@PId, valueOf@PItems output' )
Existem muitas armadilhas.que estão bem explicado aqui, como você está em 2012, você desejará executar a consulta remota com o conjunto de resultados.alguma versão disso.
SELECT * FROM OPENQUERY(LinkedServerName,
'EXEC msdb..sp_helpindex sysjobs
WITH RESULT SETS ((index_name sysname,
index_description nvarchar(500),
index_keys nvarchar(500)))')