Retroceder   Foros del Web > Programación para sitios web > Bases de Datos

Respuesta
 
Herramientas Desplegado
Antiguo 11-oct-2004, 16:50   #1 (permalink)
RsOfT está en el buen camino
 
Avatar de RsOfT
 
Fecha de Ingreso: noviembre-2002
Ubicación: InterNET
Mensajes: 1.005
Enviar un mensaje por ICQ a RsOfT Enviar un mensaje por Yahoo  a RsOfT
Cómo hacer un Insert a un LiskServer por OpenQuery?

Estoy trabajando en SQL Server y tengo un Link Server con Oracle.

Antes ejecutaba los select, insert, update, delete asi:

Código:
Select * from LINKSERVER..USUARIO.TABLA
Pero asi es muy lento porque de esa forma SQL Server no utiliza los índices. AHora lo hago asi:

Código:
Select * from OpenQuery(LINKSERVER,'Select * from TABLA')
Pero he intentado asi lo siguiete:
Código:
Select * from OpenQuery(LINKSERVER,'Insert Into TABLA (Campo) Values(Valor)')
Pero me da error, como puedo hacer un insert con openquery?
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
RsOfT está desconectado   Responder Citando
Antiguo 11-oct-2004, 17:26   #2 (permalink)
Moderador
RootK llegará a ser famoso muy prontoRootK llegará a ser famoso muy pronto
 
Avatar de RootK
 
Fecha de Ingreso: noviembre-2002
Ubicación: México D.F
Mensajes: 7.552
Enviar un mensaje por MSN a RootK
Ya te aseguraste de haber linkeado previamente el server.. que en éste caso es Oracle??

Sería algo como ésto:

Cita:
EXEC sp_addlinkedserver
@server = 'NombreServer',
@srvproduct = 'Oracle',
@provider = 'MSDAORA',
@datasrc = 'MyServer'
Despues ya puedes hacer ésto:

Cita:
SELECT *
FROM OPENQUERY('NombreServer', 'SELECT ....')
Pruebalo y nos avisas que tal..

Salu2
__________________
Nadie roba nada ya que en la vida todo se paga . . .
RootK está desconectado   Responder Citando
Antiguo 11-oct-2004, 18:37   #3 (permalink)
RsOfT está en el buen camino
 
Avatar de RsOfT
 
Fecha de Ingreso: noviembre-2002
Ubicación: InterNET
Mensajes: 1.005
Enviar un mensaje por ICQ a RsOfT Enviar un mensaje por Yahoo  a RsOfT
Si, el server está linkiando, y los select los hace bien, lo que no puedo hacer es los insert con openquery.
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
RsOfT está desconectado   Responder Citando
Antiguo 12-oct-2004, 09:37   #4 (permalink)
Moderador
Mithrandir llegará a ser famoso muy prontoMithrandir llegará a ser famoso muy pronto
 
Avatar de Mithrandir
 
Fecha de Ingreso: abril-2003
Mensajes: 12.108
quiza el error este no en el insert, sino que en la cadena del OPENQUERY no acepta parametros.

Si tienes algo del tipo:

Código:
SELECT *
FROM OPENQUERY(OracleSvr, 'SELECT name, id FROM joe.titles WHERE campo = ''abc''')
Funciona, pero en cambio algo del tipo:
Código:
DECLARE @filtro VARCHAR(10)
SET @filtro = 'abcd'
SELECT *
FROM OPENQUERY(OracleSvr, 'SELECT name, id FROM joe.titles WHERE campo = ''' + @filtro + ''')
No funcionará por el parámetro que intentas agregar
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
Mithrandir está desconectado   Responder Citando
Antiguo 12-oct-2004, 10:55   #5 (permalink)
RsOfT está en el buen camino
 
Avatar de RsOfT
 
Fecha de Ingreso: noviembre-2002
Ubicación: InterNET
Mensajes: 1.005
Enviar un mensaje por ICQ a RsOfT Enviar un mensaje por Yahoo  a RsOfT
Mithrandir, las variables si funcionan.
Vuelvo y repido, mi problema no son los select, pues estos, con variables o sin ellas, funcionan perfectamente, el problema está cuando intento hacer un insert, update, etc. Osea cuando intento hacer algo que no sea select.

Esto me funciona perfectamente:
Select * from openquery(LINKSERVER,'Select * from Tabla')

Pero esto no me funciona para nada:
Select * from openquery(LINKSERVER,'Delete from Tabla')

Me tira el siguiente error:
Cita:
Server: Msg 7357, Level 16, State 2, Line 1
Could not process object 'Delete from TABLA'. The OLE DB provider 'MSDAORA' indicates that the object has no columns.
OLE DB error trace [Non-interface error: OLE DB provider unable to process object, since the object has no columnsProviderName='MSDAORA', Query=Delete from TABLA'].
Me parece que no es nada que ver con los servidores de SQL ni de Oracle, sino que no estoy utilizando la sintaxis correcta para hacer el Delete, o el insert, etc.

Intenté haciendo esto:
Código:
Delete from  openquery(SAP,'Delete from ZHORASEXTRAS')
Y nada de nada.
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
RsOfT está desconectado   Responder Citando
Antiguo 12-oct-2004, 11:58   #6 (permalink)
Moderador
RootK llegará a ser famoso muy prontoRootK llegará a ser famoso muy pronto
 
Avatar de RootK
 
Fecha de Ingreso: noviembre-2002
Ubicación: México D.F
Mensajes: 7.552
Enviar un mensaje por MSN a RootK
Creo que ya ví el fallo rsoft.., lo que pasa es que estas colocando un select antes de tu openquery y lo que deseas hacer es un delete..

Deberías hacer algo como ésto:

Cita:
DELETE OPENQUERY(LINKSERVER, 'SELECT * FROM oracle.Tabla')
Pruebalo y nos avisas que tal te fue..
RootK está desconectado   Responder Citando
Antiguo 12-oct-2004, 12:14   #7 (permalink)
RsOfT está en el buen camino
 
Avatar de RsOfT
 
Fecha de Ingreso: noviembre-2002
Ubicación: InterNET
Mensajes: 1.005
Enviar un mensaje por ICQ a RsOfT Enviar un mensaje por Yahoo  a RsOfT
Bueno, el delete del select lo hizo

Pero Cómo sería para el Insert y el Update?

Insenté poniendolo asi:
Insert Into OpenQuery(LINKSERVER,'Select '''VALOR1'',VALOR2)

Y me da error...
Donde le especifico la tabla?
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
RsOfT está desconectado   Responder Citando
Antiguo 13-oct-2004, 16:54   #8 (permalink)
Moderador
Mithrandir llegará a ser famoso muy prontoMithrandir llegará a ser famoso muy pronto
 
Avatar de Mithrandir
 
Fecha de Ingreso: abril-2003
Mensajes: 12.108
Viendo lo que te funcionó se me ocurre algo del tipo:

INSERT INTO OpenQuery(LINKSERVER,'SELECT * FROM tabla') AS tabla VALUES ('jeje', 'juju')

Aunque nunca lo he intentado (los linked servers los hago unicamente para SELECTs)

Por otro lado... Para que necesitas acceso a indices en un Insert?. Puedes usar el nombre qualificado tradicional (server.db.dueño.tabla)
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
Mithrandir está desconectado   Responder Citando
Antiguo 14-oct-2004, 06:03   #9 (permalink)
RsOfT está en el buen camino
 
Avatar de RsOfT
 
Fecha de Ingreso: noviembre-2002
Ubicación: InterNET
Mensajes: 1.005
Enviar un mensaje por ICQ a RsOfT Enviar un mensaje por Yahoo  a RsOfT
Cita:
Por otro lado... Para que necesitas acceso a indices en un Insert?. Puedes usar el nombre qualificado tradicional (server.db.dueño.tabla)
Es que hace los insert muy, muy lento. Aunque tengo entendido que para los insert no se necesitan índices, porque es solo agregar uno o varios registros. Pero, como dije anteriormente, lo hace muy lento el insert, bueno todo con server.db.dueño.tabla es super archi lento.

Ahora pruebo la idea que enviaste, y en un rato te cuento.
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
RsOfT está desconectado   Responder Citando
Antiguo 14-oct-2004, 06:24   #10 (permalink)
RsOfT está en el buen camino
 
Avatar de RsOfT
 
Fecha de Ingreso: noviembre-2002
Ubicación: InterNET
Mensajes: 1.005
Enviar un mensaje por ICQ a RsOfT Enviar un mensaje por Yahoo  a RsOfT
Estuve probando:

Código:
INSERT INTO OpenQuery(SAP,'Select COD_IND,DIRECCION,DESCRIPCION,DIA,MES,NOMBRE_MES,ANO,STANDARD,MALO,REGULAR,BUENO from zIndicador 
as values (8,''OPERACIONES'',''HORAS,EXTRAS,(%,DE,LA,NÓMINA)'',30,09,''SEP'',2004,16.00,16.88,16.24,15.76)')
Server: Msg 170, Level 15, State 1, Line 2
Line 2: Incorrect syntax near ')'.



Código:
INSERT INTO OpenQuery(SAP,'Select COD_IND,DIRECCION,DESCRIPCION,DIA,MES,NOMBRE_MES,ANO,STANDARD,MALO,REGULAR,BUENO from zIndicador') 
as values  ('8,''OPERACIONES'',''HORAS,EXTRAS,(%,DE,LA,NÓMINA)'',30,09,''SEP'',2004,16.00,16.88,16.24,15.76)')
Server: Msg 156, Level 15, State 1, Line 2
Incorrect syntax near the keyword 'as'.



Código:
INSERT INTO OpenQuery(SAP,'Select COD_IND,DIRECCION,DESCRIPCION,DIA,MES,NOMBRE_MES,ANO,STANDARD,MALO,REGULAR,BUENO
from zIndicador') as  zIndicador values  ('8,''OPERACIONES'',''HORAS,EXTRAS,(%,DE,LA,NÓMINA)'',30,09,''SEP'',2004,16.00,16.88,16.24,15.76)')
Server: Msg 156, Level 15, State 1, Line 2
Incorrect syntax near the keyword 'as'.



Código:
INSERT INTO OpenQuery(SAP,'Select * from zIndicador') 
as  zIndicador values  ('8,''OPERACIONES'',''HORAS,EXTRAS,(%,DE,LA,NÓMINA)'',30,09,''SEP'',2004,16.00,16.88,16.24,15.76)')
Server: Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'as'.

Yo creo que estamos más cerca de la solución, pero aún no caigo que le está faltando ?
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
RsOfT está desconectado   Responder Citando
Antiguo 14-oct-2004, 08:55   #11 (permalink)
Moderador
RootK llegará a ser famoso muy prontoRootK llegará a ser famoso muy pronto
 
Avatar de RootK
 
Fecha de Ingreso: noviembre-2002
Ubicación: México D.F
Mensajes: 7.552
Enviar un mensaje por MSN a RootK
Prueba ahora de ésta manera:

Cita:
INSERT INTO OPENQUERY(SAP,'SELECT * FROM oracle.Tabla')
(Field1, Field2,...)
SELECT Field1, Field2,...
FROM Tabla
RootK está desconectado   Responder Citando
Antiguo 14-oct-2004, 09:47   #12 (permalink)
RsOfT está en el buen camino
 
Avatar de RsOfT
 
Fecha de Ingreso: noviembre-2002
Ubicación: InterNET
Mensajes: 1.005
Enviar un mensaje por ICQ a RsOfT Enviar un mensaje por Yahoo  a RsOfT
Funciona!!!, Funciona!!!

El único que nos falta es el Update. A ver Rootk, cómo lo pongo?
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
RsOfT está desconectado   Responder Citando
Antiguo 14-oct-2004, 15:14   #13 (permalink)
Moderador
Mithrandir llegará a ser famoso muy prontoMithrandir llegará a ser famoso muy pronto
 
Avatar de Mithrandir
 
Fecha de Ingreso: abril-2003
Mensajes: 12.108
Hmmm, como ejercicio yo tambien participo:
Código:
UPDATE query
SET query.field1 = tabla.field1,
	query.field2 = tabla.field2
FROM OPENQUERY(SAP,'SELECT * FROM oracle.Tabla') AS query
	INNER JOIN tabla
		ON query.id = tabla.id
Que tal me fue?
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
Mithrandir está desconectado   Responder Citando
Antiguo 16-oct-2004, 07:08   #14 (permalink)
RsOfT está en el buen camino
 
Avatar de RsOfT
 
Fecha de Ingreso: noviembre-2002
Ubicación: InterNET
Mensajes: 1.005
Enviar un mensaje por ICQ a RsOfT Enviar un mensaje por Yahoo  a RsOfT
Mithrandir, no lo logro adaptar para ver si me funciona. me da error.
Cómo le especifico el Where Condition?

__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
RsOfT está desconectado   Responder Citando
Antiguo 18-oct-2004, 15:04   #15 (permalink)
Moderador
Mithrandir llegará a ser famoso muy prontoMithrandir llegará a ser famoso muy pronto
 
Avatar de Mithrandir
 
Fecha de Ingreso: abril-2003
Mensajes: 12.108
Segun yo sería con algo como:
Código:
UPDATE query
SET query.field1 = tabla.field1,
	query.field2 = tabla.field2
FROM OPENQUERY(SAP,'SELECT * FROM oracle.Tabla') AS query
	INNER JOIN tabla
		ON query.id = tabla.id
WHERE tabla.campo = 'filtro' OR query.otrocampo = 'otro_filtro'
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
Mithrandir está desconectado   Responder Citando
Antiguo 19-oct-2004, 06:18   #16 (permalink)
RsOfT está en el buen camino
 
Avatar de RsOfT
 
Fecha de Ingreso: noviembre-2002
Ubicación: InterNET
Mensajes: 1.005
Enviar un mensaje por ICQ a RsOfT Enviar un mensaje por Yahoo  a RsOfT
Ese INNER JOIN me confunde y el alias query.

Estoy intentando hacerlo un poco más sencillo y puse:

Código:
UPDATE query SET query.Cod_Ind = 7.5 FROM OPENQUERY(DESARROLLO,
'Select * from ZINDICADOR') AS query WHERE query.Cod_Ind = 7
Pero me da el siguiente error:
Server: Msg 208, Level 16, State 1, Line 1
Invalid object name 'query'.

Realmente no entiendo tu lógica Mithrandir...
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
RsOfT está desconectado   Responder Citando
Antiguo 19-oct-2004, 14:32   #17 (permalink)
Moderador
Mithrandir llegará a ser famoso muy prontoMithrandir llegará a ser famoso muy pronto
 
Avatar de Mithrandir
 
Fecha de Ingreso: abril-2003
Mensajes: 12.108
Quiza no la entiendes por que no has utilizado nunca un UPDATE de esa manera, cuando yo lo vi tampoco lo hice, la idea en que se basa es:
Código:
UPDATE t1
SET t1.campo = t2.campo
FROM t1 INNER JOIN t2
ON t1.llave = t2.llave
WHERE t2.llave = 'algun filtro'
Analiza como se hace, el resto es simplemente reemplazar el "t1" por "OPENQUERY(....)"

Aunque si lo que yo puse funcionara tambien debería de funcionar lo que intentaste tu.... esperemos a ver si a RootK se le ocurre algo :-P
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
Mithrandir está desconectado   Responder Citando
Antiguo 20-oct-2004, 06:50   #18 (permalink)
RsOfT está en el buen camino
 
Avatar de RsOfT
 
Fecha de Ingreso: noviembre-2002
Ubicación: InterNET
Mensajes: 1.005
Enviar un mensaje por ICQ a RsOfT Enviar un mensaje por Yahoo  a RsOfT
Mi pregunta es, por qué utilizas INNER JOIN? solo para mostrar que se puede hacer un update entrelazando tablas o es así que tengo que hacerlo con el OpenQuery?
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
RsOfT está desconectado   Responder Citando
Antiguo 20-oct-2004, 14:36   #19 (permalink)
Moderador
Mithrandir llegará a ser famoso muy prontoMithrandir llegará a ser famoso muy pronto
 
Avatar de Mithrandir
 
Fecha de Ingreso: abril-2003
Mensajes: 12.108
Ahhh, sí, es por que en el ejemplo de RootK que dijiste que te funcionó él involucra otra tabla. Por eso yo traté de armar un ejemplo analogo para el Update.

Simplemente por eso.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
Mithrandir está desconectado   Responder Citando
Antiguo 20-oct-2004, 15:15   #20 (permalink)
RsOfT está en el buen camino
 
Avatar de RsOfT
 
Fecha de Ingreso: noviembre-2002
Ubicación: InterNET
Mensajes: 1.005
Enviar un mensaje por ICQ a RsOfT Enviar un mensaje por Yahoo  a RsOfT
Entonces cómo lo harías para una sola tabla?
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
RsOfT está desconectado   Responder Citando
Antiguo 21-oct-2004, 16:03   #21 (permalink)
Moderador
Mithrandir llegará a ser famoso muy prontoMithrandir llegará a ser famoso muy pronto
 
Avatar de Mithrandir
 
Fecha de Ingreso: abril-2003
Mensajes: 12.108
Con algo como:
Código:
UPDATE OPENQUERY(DESARROLLO,'Select * from ZINDICADOR') AS query 
SET Cod_Ind = 7.5
WHERE Cod_Ind = 7
o quiza algo como:
Código:
UPDATE query 
SET query.Cod_Ind = 7.5 
FROM (SELECT * 
	FROM OPENQUERY(DESARROLLO,'Select * from ZINDICADOR') AS query 
	WHERE query.Cod_Ind = 7)
Pero no apostaría nada
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
Mithrandir está desconectado   Responder Citando
Antiguo 22-oct-2004, 06:51   #22 (permalink)
RsOfT está en el buen camino
 
Avatar de RsOfT
 
Fecha de Ingreso: noviembre-2002
Ubicación: InterNET
Mensajes: 1.005
Enviar un mensaje por ICQ a RsOfT Enviar un mensaje por Yahoo  a RsOfT
Eureca!!! Funcionó!!!

Me funcionó el primero cuando le quité el AS:
Código:
UPDATE OPENQUERY(DESARROLLO,'Select * from ZINDICADOR') 
SET Cod_Ind = 7
WHERE Cod_Ind = 7.5


Muchas gracias!!!
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
RsOfT está desconectado   Responder Citando
Antiguo 22-oct-2004, 16:16   #23 (permalink)
siannah está en el buen camino
 
Fecha de Ingreso: diciembre-2003
Ubicación: WWW
Mensajes: 98
Enviar un mensaje por MSN a siannah
Wao!!! Qué chévere está esto. Sugiero que este post sea parte de un FAQ. Con openquery sólo había hecho selects y tal como dijo RsOFT, los openquery son más rápidos. Ahora con estas soluciones que han brindado de hacer updates, inserts y deletes, se le facilita la vida a una para cualquier otro proceso...

Muchísimas gracias por sus tan adecuados razonamientos caballeros ;)....
__________________
"No nos atrevemos a muchas cosas porque son difíciles, pero son difíciles porque no nos atrevemos a hacerlas" :si:

Séneca
siannah está desconectado   Responder Citando