Parámetro XML para la consulta distribuida - Diferencia entre SQL 2005 y SQL 2012
-
26-09-2020 - |
Pregunta
He heredado una antigua base de datos SQL2005 Enterprise (en Windows 2003) que permite un parámetro XML en una consulta distribuida, 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
Esto ya no funciona en SQL2012, dice el error:
msg 9512, Nivel 16, Estado 1, Línea 1 Tipo de datos XML no se admite como un parámetro a las llamadas remotas.
MI PREGUNTA: ¿Hay un permiso o un tickbox (faceta?) Para permitir que los parámetros XML distribuyeran consultas o 2012 ya no lo respalde?
NOTA: Las tablas no tienen ninguna columna de DataType XML.Solo el parámetro es XML.
Solución 2
He encontrado la solución a mi problema.Mi parte de "nombre del servidor" del procedimiento almacenado se estaba cargando desde una columna en la base de datos que incluía el número de puerto (porque es una instancia nombrada), por lo tanto, lee
[Servername\Instance,Port].[database]....
pero cuando quité el puerto funcionó.Demostración a continuación.
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
Otros consejos
No es compatible, pero puedes moverlo.
select * from openquery( LinkedServerName, 'exec [database].dbo.sproc @Id=@Id, @PItems=@PItems output'','' @PId bigint, @PItems xml output'', valueOf@PId, valueOf@PItems output' )
Hay muchos escollos.que están bien explicado aquí , como usted está en 2012, querrá investigar la ejecución de la consulta remotacon los resultados establecidos.alguna versión de esto.
SELECT * FROM OPENQUERY(LinkedServerName,
'EXEC msdb..sp_helpindex sysjobs
WITH RESULT SETS ((index_name sysname,
index_description nvarchar(500),
index_keys nvarchar(500)))')