2011-01-20 12 views
11

voglio inserire alcuni dati sul server locale in un server remoto, e utilizzato il seguente SQL:errore quando inserire nel server collegato

select * into linkservername.mydbname.dbo.test from localdbname.dbo.test 

Ma getta il seguente errore

Il il nome dell'oggetto 'linkservername.mydbname.dbo.test' contiene più del numero massimo di prefissi. Il massimo è 2.

Come posso farlo?

risposta

12

Non penso che la nuova tabella creata con la clausola INTO supporti 4 nomi di parte. Per prima cosa è necessario creare la tabella, quindi utilizzare INSERT..SELECT per compilarla.

(vedere nota nella sezione Argomenti su MSDN: reference)

+0

Il collegamento è interrotto. – ketura

+0

grazie, link revisionato – richaux

10

La dichiarazione SELECT...INTO [new_table_name] supporta un massimo di 2 prefissi: [database].[schema].[table]

NOTA: è più performante di tirare i dati attraverso il collegamento mediante SELECT INTO vs Spingendolo attraverso INSERT INTO:

  1. SELECT INTO viene registrato in modo minimo.
  2. SELECT INTO non avvia in modo implicito una transazione distribuita, in genere.

In genere dico al punto 2, perché nella maggior parte degli scenari una transazione distribuita non viene creata implicitamente quando si utilizza SELECT INTO. Se una traccia di profiler indica che SQL Server sta ancora creando implicitamente una transazione distribuita, è possibile eseguire prima una tabella temporanea SELECT INTO per impedire la transazione implicita distribuita, quindi spostare i dati nella tabella di destinazione dalla tabella temporanea.

push vs. Pull Esempio
In questo esempio stiamo copiando i dati da [Server_A] a [server_b] attraverso un collegamento.Questo esempio presuppone esecuzione di query è possibile da entrambi server:

push
Invece di connessione a [Server_A] e spingono i dati [server_b]:

INSERT INTO [server_b].[database].[schema].[table] 
SELECT * FROM [database].[schema].[table] 

Pull
Connetti a [server_b] e carica i dati da [server_a]:

SELECT * INTO [database].[schema].[table] 
FROM [server_a].[database].[schema].[table] 
1

ho sperimentato lo stesso problema e ho eseguito la seguente soluzione: Se siete in grado di accedere al server remoto in cui si desidera inserire i dati con MSSQL o sqlcmd e ricostruire la query viceversa:

in modo da:

SELECT * INTO linkservername.mydbname.dbo.test 
FROM localdbname.dbo.test 

al seguente:

SELECT * INTO localdbname.dbo.test 
FROM linkservername.mydbname.dbo.test 

Nella mia situazione funziona bene.

@ 2Toad: Sicuramente INSERT INTO è migliore/più efficiente. Tuttavia per le query di piccole dimensioni e l'operazione rapida SELECT * INTO è più flessibile perché crea la tabella al volo e inserisce i dati immediatamente, mentre INSERT INTO richiede la creazione di una tabella (opzioni di autoidentità e così via) prima di eseguire la tua inserire l'operazione.

0

Sono stato alle prese con questo per l'ultima ora. ora mi rendo conto che utilizzando la sintassi

SELECT orderid, orderdate, empid, custid 
INTO [linkedserver].[database].[dbo].[table] 
FROM Sales.Orders; 

non funziona con i server collegati. Devi andare sul tuo server collegato e creare manualmente la tabella prima, quindi utilizzare la seguente sintassi:

INSERT INTO [linkedserver].[database].[dbo].[table] 
SELECT orderid, orderdate, empid, custid 
FROM Sales.Orders 
WHERE shipcountry = 'UK'; 
Problemi correlati