Condividi tramite


Replica di SQL Server (risoluzione dei problemi)

Questo argomento contiene le sezioni seguenti relative alla risoluzione dei problemi tra il provider OLE DB per DB2 e SQL Server (provider di dati) e SQL Server.

Mapping dei tipi di dati non corretti

Impossibile replicare le colonne DATETIME2 nelle colonne TIMESTAMP di DB2

Per altre informazioni sulla replica di SQL Server, vedere Guida per gli sviluppatori (replica) (https://go.microsoft.com/fwlink/?LinkId=193231) nella documentazione online di SQL Server.

Mappatura errata dei tipi di dati

La replica di SQL Server può convertire i dati in modo non corretto, in base ai mapping predefiniti da SQL Server a tipi di dati DB2. Consigliamo all'amministratore e allo sviluppatore di esaminare e rivedere le mappature dei tipi di dati di replica usando le seguenti stored procedure di sistema di SQL Server.

sp_helpdatatypemap

sp_getdefaultdatatypemapping

sp_setdefaultdatatypemapping

Per altre informazioni, vedere [Stored procedure di sistema (Transact-SQL)](https://go.microsoft.com/fwlink/?LinkID=180765\).

Errore durante la replica delle colonne DATETIME2 in colonne TIMESTAMP DB2

Problema

La replica di SQL Server 2008 in DB2 per z/OS potrebbe non riuscire con SQLCODE -188 (la rappresentazione di stringa di un valore datetime non è un valore datetime valido). Ciò si verifica quando la Replicazione è configurata per associare DATETIME2 a DB2 VARCHAR(27) e utilizza i comandi dell'articolo della sottoscrizione con valori di stringa letterali.

Soluzione

Riconfigurare la replica di SQL Server 2008 per eseguire il mapping di DATETIME2 a TIMESTAMP in DB2 e i comandi degli articoli di sottoscrizione con parametri. Ciò consente al provider di dati di formattare il DATETIME2 come struttura DB2 TIMESTAMP supportata dal server di database IBM DB2.

Istruzioni dettagliate

Passaggio 1. Identificare la mappatura dei tipi di dati da modificare. USE MASTER per tutti i passaggi.

select * from sys.fn_helpdatatypemap  
(  
   'MSSQLSERVER',  
    '%',  
    '%',  
    '%',  
    '%',  
    '%',  
    0  
)  
where destination_dbms = 'DB2' and source_type = 'datetime2'  
  

I risultati devono indicare il mapping_id da modificare. Nella tabella seguente viene illustrato il riquadro dei risultati per questo esempio in cui il mapping_id è 189.

mapping_id source_dbms tipo_di_sorgente destination_dbms tipo_destinazione destination_length
189 MSSQLSERVER datetime2 DB2 VARCHAR 27

Passaggio 2. Eliminare il mapping dei tipi di dati.

exec sp_dropdatatypemapping  189  

Passaggio 3. Aggiungere il mapping del tipo di dati.

exec  sp_adddatatypemapping   
    @source_dbms                  = 'MSSQLSERVER',    
    @source_type                  = 'datetime2',  
    @destination_dbms             = 'DB2',  
    @destination_type             = 'TIMESTAMP',  
    @destination_nullable         = 1,  
    @destination_createparams     = 0,  
    @dataloss                     = 0,  
    @is_default                   = 1  
  

Passaggio 4. Eseguire di nuovo la query per verificare il nuovo mapping del tipo di dati.

select * from sys.fn_helpdatatypemap  
(  
   'MSSQLSERVER',  
    '%',  
    '%',  
    '%',  
    '%',  
    '%',  
    0  
)  
where destination_dbms = 'DB2' and source_type = 'datetime2'  
  

I risultati dovrebbero visualizzare il nuovo mapping dei tipi di dati. In questo esempio il mapping_id illustrato nella tabella seguente è 189.

ID di mappatura source_dbms tipo_di_sorgente dbms di destinazione tipo_di_destinazione lunghezza della destinazione
494 MSSQLSERVER datetime2 DB2 TIMESTAMP NULLO

Passaggio 5. Identificare l'articolo relativo alla sottoscrizione di replica da riconfigurare. Utilizzare l'istruzione Transact-SQL USE per passare dal database master al database da cui si esegue la replica.

USE [Test]  
select name, status from sysarticles  

I risultati devono visualizzare il nome dell'articolo da modificare. In questo esempio la tabella seguente mostra i risultati in cui il nome è DB2TS01.

nome stato
DB2TS01 25

Se il valore di stato è 1 o 9, l'articolo viene configurato per la formattazione letterale stringa.

Se il valore di stato è 17 o 25, l'articolo viene configurato per la formattazione con parametri.

Passaggio 6. Configurare l'articolo relativo alla sottoscrizione di replica per i comandi con parametri.

USE [Test]  
DECLARE @publication AS sysname;  
DECLARE @article AS sysname;  
SET @publication = N'DB2TS_PUB01';  
SET @article = N'DB2TS01';  
  
EXEC sp_changearticle @publication, @article, 'status' , 'parameters' , 0 , 0;  
  

Per ulteriori informazioni, vedere Concetti relativi alle stored procedure di sistema di replica (https://go.microsoft.com/fwlink/?LinkId=193232) in SQL Server Books Online.

L'operazione INSERT di replica ha esito negativo con l'errore 8152: i dati stringa o binari verrebbero troncati.

Problema

L'operazione INSERT di replica di SQL Server potrebbe non riuscire con l'errore di SQL Server 8152 (i dati stringa o binari verrebbero troncati). Ciò può verificarsi quando (1) Il provider di dati non è configurato per l'uso dei metadati iniziali e (2) La replica non è configurata per l'uso di istruzioni INSERT con parametri.

Soluzione

Passaggio 1. Riconfigurare la connessione al provider di dati per specificare "Use Early Metadata=true" nella definizione dell'origine dati del Sottoscrittore di replica di SQL Server.

Per ulteriori informazioni, consultare Configurare i fornitori di dati per i collegamenti dati DB2 (DB2) - tutte le proprietà nella documentazione del provider OLE DB per DB2.

Passaggio 2 Riconfigurare l'articolo relativo alla sottoscrizione di replica di SQL Server per includere l'opzione "24" ("Include il nome della colonna nelle istruzioni INSERT e usa istruzioni con parametri).").

Per altre informazioni, vedere Replica di SQL Server sp_addarticle (Transact-SQL) nella documentazione di SQL Server.