Paramètre XML à la requête distribuée - différence entre SQL 2005 et SQL 2012
-
26-09-2020 - |
Question
J'ai hérité d'une ancienne base de données d'entreprise SQL2005 (sous Windows 2003) qui permet un paramètre XML à une requête distribuée telle que celle-ci:
exec sp_executesql 'exec [server].[database].dbo.sproc @Id=@Id,@PItems=@PItems output','@PId bigint, @PItems xml output', valueOf@PId, valueOf@PItems output
Cela ne fonctionne plus dans SQL2012, l'erreur dit:
msg 9512, niveau 16, État 1, ligne 1 Type de données XML n'est pas pris en charge comme un paramètre aux appels distants.
Ma question: Existe-t-il une permission ou une boîte de coche (facette?) Pour autoriser les paramètres XML à des requêtes distribuées ou 2012 ne le supporte plus?
Remarque: les tables ne possèdent aucune colonnes de DataType XML.Seul le paramètre est XML.
La solution 2
J'ai trouvé la solution à mon problème.Mon élément "Nom du serveur" de la procédure stockée a été chargé à partir d'une colonne de la base de données qui incluait le numéro de port (car il s'agit d'une instance nommée), donc elle a lu
[Servername\Instance,Port].[database]....
Mais quand j'ai enlevé le port, il a fonctionné.Démonstration ci-dessous.
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
Autres conseils
Ce n'est pas pris en charge, mais vous pouvez vous en contenter.
select * from openquery( LinkedServerName, 'exec [database].dbo.sproc @Id=@Id, @PItems=@PItems output'','' @PId bigint, @PItems xml output'', valueOf@PId, valueOf@PItems output' )
Il y a beaucoup de pièges.qui sont bien expliqué ici , comme vous le souhaitez 2012, vous voudrez examiner la requête distanteavec le jeu de résultats.une version de ceci.
SELECT * FROM OPENQUERY(LinkedServerName,
'EXEC msdb..sp_helpindex sysjobs
WITH RESULT SETS ((index_name sysname,
index_description nvarchar(500),
index_keys nvarchar(500)))')