[sql exp 05] Linked server con errore "nome oggetto non valido"

mercoledì 03 settembre 2008 - 17.23

Devil Profilo | Junior Member

Ciao a tutti,

navigando qua e là tra il forum e msdn sono riuscito a creare il mio primo linked server ma mi ritorna un errore che pare banale ma non riesco a risolvere.

Una volta creato li linkedServer creo la query per utilizzarlo..ma...

Questa è la sintassi:

select * from openquery([server01\sqlexpress],'select * from tabella1')

l'errore dice

OLE DB provider "SQLNCLI" for linked server "server01\sqlexpress" returned message "Deferred prepare could not be completed.".
Msg 8180, Level 16, State 1, Line 1
Impossibile preparare le istruzioni.
Msg 208, Level 16, State 1, Line 1
Il nome di oggetto 'tabella1' non è valido.

Sembra quasi che la tabella non esista..ma in realtà c'è nel database...

Quello che sospetto e che non debba indicare nella query "nomeDatabase.nomeTabella"
ma negli esempi non riscontro nulla di simile.

Credo che il linked server non abbia problemi (almeno spero) , l'inghippo dev' essere nella sintassi della query...

Qualche consiglio?

Grazie
ciao


alx_81 Profilo | Guru

>Ciao a tutti,
>
>navigando qua e là tra il forum e msdn sono riuscito a creare
>il mio primo linked server ma mi ritorna un errore che pare banale
>ma non riesco a risolvere.
>
>Una volta creato li linkedServer creo la query per utilizzarlo..ma...
Potresti indicarmi come hai aggiunto il linked server? Non vorrei che avessi indicato il db sbagliato (o avessi omesso di indicarlo).

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

lbenaglia Profilo | Guru

>select * from openquery([server01\sqlexpress],'select * from
>tabella1')

Ciao Diego,

In che schema si trova la tabella?
Specificalo sempre!

Hai provato a referenziare la tabella utilizzando il four-part name (linkedserver.database.schema.tabella) senza ricorrere alla funzione OPENQUERY?

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Devil Profilo | Junior Member

ciao ragazzi

ho fatto qualche prova anche stamattina ma continuo a sbagliare qualcosa.
Inizialmente avevo creato il linkedserver via codice ma non funzionava poi ho scoperto di poterlo fare graficamente ma ho qualche dubbio a tal proposito.

nome server-->server objects-->linked servers.....new linked server


1218x804 86Kb


il nome del linked server è il nome di rete del server che nella realtà si chiama "bercoDga01\sqlexpress"

setto poi la scheda sicurezza...


1218x804 61Kb


po ho creato una query in cui scrivo

select * from openquery([BERCODGA01\SQLEXPRESS],'select* from mansioni')

testandola, l'errore lo conoscete già.

la tabella che vi avevo indicato nell'esempio come tabella1 nella realtà si chiama mansioni
il dubbio che comincia a venirmi è:dove ho indicato il db?..e anzi dove lo indico?
(il database si chiama "simpledo")

Cosa intendete per schema?
Cosa intendete per four-part name (linkedserver.database.schema.tabella)?

io ho tentato di fare una cosa del tipo -->nuova Query-->

([bercodga01\sqlexpress].simpledo.mansioni)

ma mi dice sintassi non corretta.

Insomma, sicuramente sbaglio dei passaggi...

Sapreste indicarmi quelli corretti?

Grazie ciao

alx_81 Profilo | Guru

>ciao ragazzi
Ciao!
>
>il dubbio che comincia a venirmi è:dove ho indicato il db?..e
>anzi dove lo indico?
Esatto, era proprio quello che intendevo.. non hai specificato il nome del DB nella voce "catalog".
>
>Cosa intendete per schema?
Lo schema è un identificatore che è stato aggiunto in sql server 2005 (in 2000 esisteva un concetto di owner, differente) e serve per raggruppare logicamente un insieme di oggetti nel database. Ad esempio puoi avere nomi tabella uguali per schema diversi.. Immaginalo come un contenitore che raggruppa un insieme di oggetti.

>Cosa intendete per four-part name (linkedserver.database.schema.tabella)?
Il four part name è il nome completo per indicare un oggetto. Tu puoi interrogare un particolare oggetto database usando la sintassi indicata. E puoi fare a meno di usare OPENQUERY. In questo modo crei il collegamento al server e chiami gli oggetti con il 4-part name.

>io ho tentato di fare una cosa del tipo -->nuova Query-->
>([bercodga01\sqlexpress].simpledo.mansioni)
perchè manca lo schema. Se non l'hai indicato è dbo oppure puoi indicare lo schema di default con "..":

[bercodga01\sqlexpress].simpledo..mansioni
oppure
[bercodga01\sqlexpress].simpledo.dbo.mansioni

>Sapreste indicarmi quelli corretti?
Personalmente seguirei una ulteriore strada, con:
1) Creazione di un linked server e della security per accedere agli oggetti
2) Creazione di un sinonimo (synonym) che punta all'oggetto (con 4-part name)
3) Utilizzo del sinonimo come se fosse un oggetto del database corrente

CREATE SYNONYM
http://msdn.microsoft.com/en-us/library/ms177544.aspx

SYNONYMS
http://msdn.microsoft.com/en-us/library/ms191230.aspx
>
>Grazie ciao
di nulla!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Devil Profilo | Junior Member

...bene..dammi un pò di tempo che faccio un pò di tentativi e mi spulcio la documentazione,
poi spero tra oggi e domani di risolvere anche perchè la sett prox sono in ferie...

... inatnto grazie e a risentirci.

Ciao

Devil Profilo | Junior Member

..allora da varie prove risulatava che il linked server non fosse configurato per gli RPC

forse non serviva ma ho lanciato anche questo

exec sp_serveroption @server='bercodga01\sqlexpress', @optname='rpc', @optvalue='true'
exec sp_serveroption @server=bercodga01\sqlexpress, @optname='rpc out', @optvalue='true'

poi ho provato come da te suggerito e non ne voleva sapere, infine sono riuscito con questa sintassi

select * from openquery([BERCODGA01\SQLEXPRESS],'select * from simpledo.dbo.Mansioni')

Adesso faccio qualche prova con i Synonyms.


Devil Profilo | Junior Member

...olè!

allora ho creato un synonym attraverso la procedura grafica inidcando nome del Link server, nome db, nome tabella ,,ecc..

il cui nome è dbo.Mansioni

poi ho lanciato questo indicando il nome del db in cui ho creato il synonym

USE domino;
GO
EXECUTE ('SELECT * FROM dbo.Mansioni');
GO

...risultato ottenuto!!!


Ciao e grazie ancora...alla prossima!

lbenaglia Profilo | Guru

>USE domino;
>GO
>EXECUTE ('SELECT * FROM dbo.Mansioni');
>GO

Puoi togliere l'Execute e scrivere semplicemente:

SELECT * FROM dbo.Mansioni;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Devil Profilo | Junior Member

è vero, l'ho appena scoperto eseguendo la query da asp per creare un sqlDataSource..

ciao
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5