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.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top