2011-01-20 18 views
11

quiero insertar algunos datos en el servidor local en un servidor remoto, y se utiliza el siguiente código SQL:error al insertar en el servidor vinculado

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

Pero arroja el siguiente error

El El nombre del objeto 'nombre del servidor de enlaces.mydbname.dbo.test' contiene más que el número máximo de prefijos. El máximo es de 2.

¿Cómo puedo hacer eso?

Respuesta

12

No creo que la nueva tabla creada con la cláusula INTO sea compatible con 4 nombres de partes. Debería crear primero la tabla y luego usar INSERT..SELECT para llenarla.

(Ver nota en la sección Argumentos en MSDN: reference)

+0

enlace está roto. – ketura

+0

gracias, enlace revisado – richaux

10

La declaración SELECT...INTO [new_table_name] admite un máximo de 2 prefijos: [database].[schema].[table]

NOTA: es más performante para extraer los datos a través del enlace usando SELECT INTO vs al presionarlo usando INSERT INTO:

  1. SELECT INTO se registran mínimamente.
  2. SELECT INTO no inicia implícitamente una transacción distribuida, por lo general.

Digo normalmente, en el punto # 2, porque en la mayoría de los escenarios, una transacción distribuida no se crea implícitamente al utilizar SELECT INTO. Si un rastreo del generador de perfiles indica que SQL Server aún está creando implícitamente una transacción distribuida, primero puede SELECT INTO una tabla temporal, para evitar la transacción distribuida implícita, luego mover los datos a su tabla de destino desde la tabla temporal.

push pull vs Ejemplo
En este ejemplo estamos copiando los datos de [server_a] a [server_b] través de un enlace.En este ejemplo se asume ejecución de la consulta es posible desde ambos servidores:

empuje
lugar de conectarse a [server_a] y empujando los datos a [server_b]:

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

Tire
Conectar a [server_b] y extraer los datos de [server_a]:

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

que he experimentado el mismo tema y he realizado la siguiente solución: Si usted es capaz de iniciar una sesión en el servidor remoto al que desea insertar datos con MSSQL o sqlcmd y reconstruir su consulta viceversa:

modo de:

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

a lo siguiente:

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

En mi situación que funciona bien.

@ 2Toad: Por supuesto INSERT INTO es mejor/más eficiente. Sin embargo, para pequeñas consultas y rápida operación SELECT * INTO es más flexible, ya que crea la tabla en la marcha e introduzca sus datos de inmediato, mientras que INSERT INTO requiere la creación de una mesa (opciones de auto-IDENT, etc.) antes de llevar a cabo su operación de inserción.

0

He estado luchando con esto durante la última hora. ahora me doy cuenta que el uso de la sintaxis

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

no funciona con servidores vinculados. Usted tiene que ir en su servidor vinculado y crear manualmente la tabla en primer lugar, a continuación, utilizar la siguiente sintaxis:

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