OPENROWSET sullo stesso Server

martedì 04 dicembre 2007 - 12.34

davideb Profilo | Newbie

Salve a tutti,
ho un problema su SQL SERVER 2000 Enterprise utilizzando un OPENROWSET sullo stesso server (e sullo stesso database) incapsulato in una vista che lancia una stored procedure,
ecco il codice:
-------------------------------------------------
create view pippo as

SELECT a.* FROM
openrowset
('SQLOLEDB','SERVER=(local);Trusted_Connection=yes;',
'SET FMTONLY OFF;
DECLARE @par AS INT
set @par = 1
EXEC northwind.dbo.sp_prova @par ' ) a
--------------------------------------------------
La stored procedure costruisce dinamicamente una SELECT in base al paramentro passato (e ad altri fattori definiti nella logica interna della SP) e la esegue restituendo i risultati all'OPENROWSET.. e qui funziona tutto correttamente
La peculiarita' di questa SELECT generata dinamicamente e' che i campi da restituire possono essere variabili...
da qui il problema derivato dalla staticita' delle viste.. risolvibile lanciando la sp_refreshview che rigenera il piano di esecuzione della vista qualora ce ne fosse bisogno.. tutto finzionerebbe se non fosse per quell'OPENROWSET, difatti ogni volta che tento di eseguire la
sp_refreshview mi restituisce il seguente errore:
------------------------
EXEC sp_refreshview pippo
GO

Il provider OLE DB 'SQLOLEDB' non è in grado di avviare una transazione distribuita. Impossibile eseguire l'operazione.
[OLE/DB provider returned message: Impossibile aggiungere la nuova transazione all'elenco del coordinatore di transazioni specificato. ]
-------------------------
Ho provato a fare un po' di troubleshooting dell'errore leggendomi gli articoli sul sito della Microsoft al riguardo ed eseguendo le pratiche consigliate che riguardano i settaggi del MSDTC.. con scarsi risultati.. ma mi rendo conto che questa e' una situazione particolare visto che l'OPENROWSET richiama lo stesso server quindi non si puo' parlare propriamente di query distribuite.... c'e' qualcuno che sa come risolvere questo problema senza per forza fare DROP e CREATE della vista ogni volta ?
Grazie in anticipo


lbenaglia Profilo | Guru

>La stored procedure costruisce dinamicamente una SELECT in base
>al paramentro passato (e ad altri fattori definiti nella logica
>interna della SP) e la esegue restituendo i risultati all'OPENROWSET..

Ciao,

con una soluzione del genere perderesti ogni vantaggio legato all'utilizzo delle stored procedure (principalmente execution plan compilato 1 sola volta per contesto di sicurezza).

>e qui funziona tutto correttamente
>La peculiarita' di questa SELECT generata dinamicamente e' che
>i campi da restituire possono essere variabili...
>da qui il problema derivato dalla staticita' delle viste.. risolvibile
>lanciando la sp_refreshview che rigenera il piano di esecuzione
>della vista qualora ce ne fosse bisogno.. tutto finzionerebbe
>se non fosse per quell'OPENROWSET, difatti ogni volta che tento
>di eseguire la
>sp_refreshview mi restituisce il seguente errore:
Perdonami, se anche fosse possibile vorresti rinfrescare la vista ad ogni esecuzione?

Ti suggerisco:

1) Non utilizzare Dynamic SQL per tutti i motivi che trovi descritti in questo articolo di Erland: http://www.sommarskog.se/dynamic_sql.html

2) Non utilizzare la OPENROWSET come "workaround" per richiamare sp da comandi di SELECT, il suo scopo è ben diverso.

3) A maggior ragione non racchiudere una chiamata del genere in una vista

>Grazie in anticipo
Prego.

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

davideb Profilo | Newbie

>con una soluzione del genere perderesti ogni vantaggio legato all'utilizzo delle stored procedure (principalmente execution plan compilato >1 sola volta per contesto di sicurezza).
Ero al corrente che questa non poteva essere per forza di cose la soluzione ottimale ma ho voluto cercare di soddisfare una richiesta del cliente.. ovvero quella di poter continuare ad utilizzare la vista che prima era una normalissima SELECT statica.. ma che per necessita' di progetto dovra' diventare dinamica


>Perdonami, se anche fosse possibile vorresti rinfrescare la vista ad ogni esecuzione?
Non ad ogni esecuzione, ma ogni volta che vengono modificati dei record in alcune tabelle che farebbero variare il numero di campi da restituire nella SELECT generata dinamicamente.. avevo intenzione di mettere il codice che fa il refresh delle viste all'interno di triggers creati ad hoc su tali tabelle

>Ti suggerisco:

>1) Non utilizzare Dynamic SQL per tutti i motivi che trovi descritti in questo articolo di Erland: http://www.sommarskog.se/dynamic_sql.html
Ti ringrazio per l'articolo

>2) Non utilizzare la OPENROWSET come "workaround" per richiamare sp da comandi di SELECT, il suo scopo è ben diverso.
Ho provato ad usare le UDF che retituiscono l'output in formato tabellare ma ho dovuto abbandonare questa strada perche' la struttura della tabella di OUTPUT non sarebbe fissa ma variabile ... al loro posto ho invece utilizzato le UDF scalari per costruire la stringa di SQL dinamico che viene eseguito all'interno della stored procedure

>3) A maggior ragione non racchiudere una chiamata del genere in una vista
Come gia' detto ho cercato di soddisfare una richiesta del cliente.. ma a questo punto provero' a leggere l'articolo del link che mi hai fornito per vedere se riesco a trovare altre soluzioni...
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