Parametro XML a query distribuita - differenza tra SQL 2005 e SQL 2012
-
26-09-2020 - |
Domanda
Ho ereditato un vecchio database Enterprise SQL2005 (su Windows 2003) che consente a un parametro XML a una query distribuita come questa:
exec sp_executesql 'exec [server].[database].dbo.sproc @Id=@Id,@PItems=@PItems output','@PId bigint, @PItems xml output', valueOf@PId, valueOf@PItems output
.
Questo non funziona più in SQL2012, l'errore dice:
.Msg 9512, Livello 16, stato 1, linea 1 Tipo di dati XML non è supportato come Un parametro su chiamate remote.
La mia domanda: esiste un permesso o un tickbox (Facet?) Per consentire ai parametri XML alle query distribuite o al 2012 non lo supporta più?
Nota: le tabelle non hanno colonne di Datatipo XML.Solo il parametro è XML.
Soluzione 2
Ho trovato la soluzione al mio problema.Il mio "nome del server" parte della stored procedure è stato caricato da una colonna nel database che includeva il numero di porta (perché è un'istanza denominata), quindi ha letto
[Servername\Instance,Port].[database]....
.
Ma quando ho rimosso la porta ha funzionato.Dimostrazione di seguito.
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
. Altri suggerimenti
Non è supportato, ma puoi aggirarlo ..
select * from openquery( LinkedServerName, 'exec [database].dbo.sproc @Id=@Id, @PItems=@PItems output'','' @PId bigint, @PItems xml output'', valueOf@PId, valueOf@PItems output' ).
Ci sono molte insidie.che stanno bene spiegato qui , come sei il 2012, vorrai esaminare nell'esecuzione della query remotacon risultati impostati.qualche versione di questo.
SELECT * FROM OPENQUERY(LinkedServerName,
'EXEC msdb..sp_helpindex sysjobs
WITH RESULT SETS ((index_name sysname,
index_description nvarchar(500),
index_keys nvarchar(500)))')
.