Sp_addlinkedserver

giovedì 13 dicembre 2007 - 16.57

Teech Profilo | Expert

Ho un server SQL2005(Server1) al quale aggiungo un linked server (Server2)
In Server2 ho diversi DB (DB1, DB2, DB3) tutti con la stessa struttura

Quando lancio il batch
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Mi ritrovo nei catalog tutti i DB di Server2...
Ho provato anche la lanciare il batch nel seguente modo (passando il catalogo come stringa):
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Vorrei poter creare delle Inline Table Valued Function che in base al catalogo da me indicato mi crei una tabella popolata con i dati del catalogo selezionato...

CREATE FUNCTION [dbo].[MiaFUNCT] () RETURNS TABLE AS RETURN ( SELECT * FROM OPENQUERY ( LINK, 'SELECT Campo1 AS Codice, Campo2 AS Descrizione FROM dbo.TabellaX' ) )

Non essendo indicato il catalog nella function (e non saprei nemmeno come fare perchè @mioparametro.dbo.TabellaX non funzionerebbe) non riesco a recuperare i dati...

Non capisco esattamente come comportarmi quindi vi chiedo un aiutino...

Grazie!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

lbenaglia Profilo | Guru

>Vorrei poter creare delle Inline Table Valued Function che in
>base al catalogo da me indicato mi crei una tabella popolata
>con i dati del catalogo selezionato...
>
>CREATE FUNCTION [dbo].[MiaFUNCT] ()
>RETURNS TABLE
>AS
>RETURN
>(
> SELECT * FROM OPENQUERY (
> LINK,
> 'SELECT Campo1 AS Codice, Campo2 AS Descrizione
> FROM dbo.TabellaX'
> )
>)
>
>Non essendo indicato il catalog nella function (e non saprei
>nemmeno come fare perchè @mioparametro.dbo.TabellaX non funzionerebbe)
>non riesco a recuperare i dati...
>
>Non capisco esattamente come comportarmi quindi vi chiedo un
>aiutino...

Ciao Maurizio,

semplice, OPENQUERY non è parametrizzabile
Potresti utilizzare il four-part name e un po' di Dynamic SQL ma quest'ultimo non è valido nelle UDF, quindi anche questa strada non è percorribile.
Quindi, o ti accontenti delle stored proedure oppure non mi vengono in mente altre soluzioni.

>Grazie!!!
Prego.

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

Teech Profilo | Expert

Grazie della delucidazione (anche se mi mette in difficoltà)

A questo punto però non capisco a cosa serve e come si utilizza il paramtro @catalog nella sp_addlinkedserver...

Se indico un catalogo non dovrei avere "disponibile" solo il DB indicato nello stesso? Perchè, se lo indico, mi risultano tutti i DB?

Se nella OPENQUERY indico la seguente SELECT
SELECT Campo1 AS Codice, Campo2 AS Descrizione FROM dbo.TabellaX
mi viene restituito l'errore
'Il nome dell'oggetto TabellaX non è valido'
La logica è corretta in quanto la select non sa a che DB del linked server deve collegarsi ma allo stesso tempo non lo so nemmeno io in fase di "costruzione" del DB quindi non posso indicare DB.dbo.TabellaX perchè DB è, per me, variabile... DB, non dovrebbe essere il catalog indicato? (almeno nelle stringhe di connessione è così).

Spero di essere stato chiaro in quanto la situazione è un pò macchinosa...

Grazie mille!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

lbenaglia Profilo | Guru

>A questo punto però non capisco a cosa serve e come si utilizza
>il paramtro @catalog nella sp_addlinkedserver...
>
>Se indico un catalogo non dovrei avere "disponibile" solo il
>DB indicato nello stesso? Perchè, se lo indico, mi risultano
>tutti i DB?
I Books Online riportano: "When the linked server is defined against an instance of SQL Server, catalog refers to the default database to which the linked server is mapped".

Un linked server è appunto un collegamento ad una istanza remota, quindi, permission permettendo, avrai accesso a tutti i db ospitati dall'istanza.

>Se nella OPENQUERY indico la seguente SELECT
>SELECT Campo1 AS Codice, Campo2 AS Descrizione FROM dbo.TabellaX
>mi viene restituito l'errore
>'Il nome dell'oggetto TabellaX non è valido'
>La logica è corretta in quanto la select non sa a che DB del
>linked server deve collegarsi ma allo stesso tempo non lo so
>nemmeno io in fase di "costruzione" del DB quindi non posso indicare
>DB.dbo.TabellaX perchè DB è, per me, variabile... DB, non dovrebbe
>essere il catalog indicato? (almeno nelle stringhe di connessione
>è così).

Quando definisci un linked server dovrai in qualche modo indicare una login per eseguire l'autenticazione sull'istanza remota.
Questa login avrà un default database associato, quindi se stai definendo un linked server ad una istanza SQL Server puoi evitare di specificare il parametro @catalog, e come default database sarà utilizzato quello associato alla login remota.

Nella SELECT specificata in OPENQUERY non occorre quindi specificare il db se intenti connetterti al default database associato alla login remota.

>Spero di essere stato chiaro in quanto la situazione è un pò
>macchinosa...


>Grazie mille!!!
Prego.

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

Teech Profilo | Expert

RISOLTO!!!
L'errore che facevo era quello di passare alla Stored Procedure sp_addlinkedserver i parametri in modo "posizionale" omettendo 2 paramtri.

I parametri possibili sono:
@server
@srvproduct
@provider
@datasrc
@location
@providerstr
@catalog

Erroneamente scrivevo:
sp_addlinkedserver 'NOMELINK', '','SQLNCLI','MiaSource','NomeDB'
omettendo @location e @providerstr... In questo modo 'NomeDB' veniva associata al parametro @location

Scrivendo correttamente:
sp_addlinkedserver 'NOMELINK', '','SQLNCLI','MiaSource','','','NomeDB'
Funziona alla grande associando al linked server il catalogo che gli passo come predefinito indipendentemente dallo user...

Grazie tante!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5