sql-server - open - select linked server sql server
error cuando se inserta en el servidor vinculado (3)
La SELECT...INTO [new_table_name]
admite un máximo de 2 prefijos: [database].[schema].[table]
NOTA: es más eficaz tirar de los datos a través del enlace usando SELECT INTO
vs. empujarlo usando INSERT INTO
:
-
SELECT INTO
está mínimamente registrado. -
SELECT INTO
no inicia implícitamente una transacción distribuida, por lo general.
Digo típicamente, en el punto n. ° 2, porque en la mayoría de los escenarios, una transacción distribuida no se crea implícitamente cuando se usa SELECT INTO
. Si un rastreo del generador de perfiles indica que SQL Server todavía está creando implícitamente una transacción distribuida, puede SELECT INTO
una tabla temporal primero, para evitar la transacción distribuida implícita, luego mover los datos a su tabla de destino desde la tabla temporal.
Ejemplo de empuje frente a extracción
En este ejemplo, estamos copiando datos de [server_a] a [server_b] a través de un enlace. Este ejemplo asume que la ejecución de consultas es posible desde ambos servidores:
empujar
En lugar de conectarse a [server_a] y enviar los datos a [server_b]:
INSERT INTO [server_b].[database].[schema].[table]
SELECT * FROM [database].[schema].[table]
Halar
Conéctese a [server_b] y extraiga los datos de [server_a]:
SELECT * INTO [database].[schema].[table]
FROM [server_a].[database].[schema].[table]
Quiero insertar algunos datos en el servidor local en un servidor remoto, y utilicé el siguiente sql:
select * into linkservername.mydbname.dbo.test from localdbname.dbo.test
Pero arroja el siguiente error
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 2.
¿Cómo puedo hacer eso?
No creo que la nueva tabla creada con la cláusula INTO
compatible con 4 nombres de partes. Primero necesitaría crear la tabla, luego usar INSERT..SELECT
para completarla.
(Consulte la nota en la sección Argumentos en MSDN: referencia )
He experimentado el mismo problema y realicé la siguiente solución: si puede iniciar sesión en el servidor remoto donde desea insertar datos con MSSQL o sqlcmd y reconstruir su consulta, viceversa:
así que 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, funciona bien.
@ 2Toad: Por supuesto, INSERT INTO es mejor / más eficiente. Sin embargo, para consultas pequeñas y operación rápida, SELECT * INTO es más flexible porque crea la tabla sobre la marcha e inserta sus datos inmediatamente, mientras que INSERT INTO requiere la creación de una tabla (opciones de autoidentificación, etc.) antes de llevar a cabo su operación de inserción.