Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Uso di tabelle temporanee

263 views
Skip to first unread message

Vincenzo Morgante

unread,
Mar 13, 2003, 8:24:57 AM3/13/03
to
Ho un problema sull'utilizzo di tabelle temporanee globali:


Ho questa situazione (semplificata)

Create Procedure "spFiltra"
As
DECLARE @Condizioni NVARCHAR(100)
IF EXISTS (SELECT 1 FROM sysobjects WHERE OBJECT_NAME(id) =
'##Tabella1')
DROP TABLE ##Tabella1

IF EXISTS (SELECT 1 FROM sysobjects WHERE OBJECT_NAME(id) =
'##Tabella2')
DROP TABLE ##Tabella2

SELECT * INTO ##Tabella1 FROM TabellaDB

SET @Condizioni = 'SELECT * INTO ##Tabella2 FROM ## Tabella1'

EXEC @Condizioni

SELECT * FROM ##Tabella2

Le cancellazioni iniziali mi servono poiche' la SP viene lanciata anche
piu' volte per la stessa connessione.

La prima select che porta l'elaborazione dei dati della tabellaDB in
##Tabella1 mi visualizza l'errore dicendomi che già "esiste una tabella
con il nome ##Tabella1"

Utilizzo L'EXEC poiche' le mie condizioni rappresentano un stringa che
conpongo a seconda dei parametri che mi passano e quindi eseguo l'exec su
una query costruita dinamicamente.

Cosa c'e' che non va?

--
Vincent

VB6+SP5 Windows 2000 SP3
MSDE 7

Luca Bianchi

unread,
Mar 13, 2003, 9:15:21 AM3/13/03
to
Vincenzo, il controllo di esistenza delle tabelle temporanee va fatto nella
tabella sysobjects del TempDB mentre nella stored procedure che hai creato
il controllo viene eseguito nel contesto del database corrente.
Quindi dovresti modificare i controlli in

==========================
IF EXISTS (SELECT 1 FROM tempdb..sysobjects WHERE OBJECT_NAME(id) =
'##Tabella1')
==========================

Ciao...


Luca Bianchi


"Vincenzo Morgante" <vmor...@NOSPAMhotmail.com> wrote in message
news:Xns933D92D639895vm...@207.46.248.16...

Vincenzo Morgante

unread,
Mar 13, 2003, 9:48:01 AM3/13/03
to
Grazie, ho risolto popolando una tabella temporanea (#Tabella1) e
cancellando le righe che non mi interessavano.

In query analyzer tutto ok mi ritorna le righe che mi interessano.

Richiamando la SP in VB:

... passaggio parametri etc....
set rsRicerca = cmd.execute

il recordset non risulta popolato e l'0associazione tra rsricerca e
mshflexgrid:

set griglia.datasource = rsricerca

mi genera:

Errore Runtime 30022

Il controllo Hierarchical FlexGrid non supporta il tipo di associazione di
dati necessario.

(questo e' un bug del controllo ma non capisco come mai mi viene fuori solo
quando la mia procedura prende i record facendo una select da una tabella
temporanea)


Ti ripeto l'esempio. la mia procedura (semplificata) fa questo


SELECT * INTO #Tabella1 FROM TabellaDB

DELETE FROM #Tabella1 WHERE Campo = 0
DELETE FROM #Tabella1 WHERE Campo1 = 0

SELECT * FROM #Tabella1

in QA tutto ok. Ritorna 5 righe.

Vincenzo Morgante

unread,
Mar 13, 2003, 10:04:49 AM3/13/03
to
Ho trovato il problema. Vorrei la soluzione...

Ho la mia routine in VB (griglia e' un controllo MSHflexgrd)

Public Function pippo() As ADODB.Recordset
Dim cmd As ADODB.Command
Dim rsRicerca As ADODB.Recordset
Dim Params As ADODB.Parameters
' SELEZIONA LA SP DA ESEGUIRE,CONNESSIONE ECC...

Set cmd = New ADODB.Command
With cmd
Set .ActiveConnection = cnn
.CommandText = "spprovatabellatemporanea"
.CommandType = adCmdStoredProc
End With

Set Griglia.datasource = cmd.Execute()

Set cmd = Nothing
End Function


Se eseguo questa

CREATE Procedure spProvaTabellaTemporanea
as
SELECT *
INTO #Tabella
FROM TabellaStatica

SELECT * FROM #Tabella

Return 0

mi genera errore il controllo (ed il recordset e' vuoto)

mentre se eseguo
CREATE Procedure spProvaTabellaTemporanea
as
SELECT *
FROM TabellaStatica

Return 0


allora funziona tutto a meraviglia.


E' unbug o le tabelle temporanee creano problemi richiamando le SP da VB?

Luca Bianchi

unread,
Mar 13, 2003, 10:15:11 AM3/13/03
to
Ho trovato traccia del bug che hai riscontrato su

http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B189998

Hai fatto ciò che indica l'articolo nella sezione Resolution?
Inoltre perchè crei prima la tabella con l'istruzione SELECT...INTO e poi
elimini alcuni record? Ti servono in precedenza? Sai, sono un pignolo e non
posso vedere "istruzioni simili"... :-))))))))))))))

Ciao...


Luca Bianchi


"Vincenzo Morgante" <vmor...@NOSPAMhotmail.com> wrote in message

news:Xns933DA0EC3F8A0vm...@207.46.248.16...

Vincenzo Morgante

unread,
Mar 13, 2003, 10:22:53 AM3/13/03
to
"Luca Bianchi" <rightjoinR...@hotmail.com> scritto in news:
#jgt5MX6...@TK2MSFTNGP11.phx.gbl:

> http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B189998

si si l'avevo trovato ma non mi risolve il problema. ho ripostato l'esempio
pulito.

Faccio la select di tutto poiche' mi trovo a concatenare ed elaborare
risultati di altri risultati di selezioni.... perdono ma e' l'unica strada
(tanto e' un gestionale ed i record non sono tantissimi) ;-)

Lorenzo Benaglia

unread,
Mar 13, 2003, 11:25:08 AM3/13/03
to
"Vincenzo Morgante" <vmor...@NOSPAMhotmail.com> wrote in message
news:Xns933DA3C58A5C9vm...@207.46.248.16...

Ciao Vincenzo,

> Ho trovato il problema. Vorrei la soluzione...
>

Credo che sia sufficiente aggiungere una SET NOCOUNT ON alla definizione
della Stored Procedure.

CREATE PROCEDURE spProvaTabellaTemporanea
AS

SET NOCOUNT ON

SELECT *
INTO #Tabella
FROM Northwind.dbo.Customers

SELECT * FROM #Tabella

RETURN 0


Private Sub Command1_Click()
Dim cn As ADODB.Connection


Dim cmd As ADODB.Command
Dim rsRicerca As ADODB.Recordset
Dim Params As ADODB.Parameters

Set cn = New ADODB.Connection
With cn
.Provider = "SQLOLEDB"
.ConnectionString = "Data Source=localhost;" & _
"Initial Catalog=tempdb;" & _
"Integrated Security=SSPI"
.Open
End With

Set cmd = New ADODB.Command
With cmd
Set .ActiveConnection = cn

.CommandText = "spprovatabellatemporanea"
.CommandType = adCmdStoredProc
End With

Set Griglia.DataSource = cmd.Execute()

Set cmd = Nothing

End Sub


Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server

UGIdotNET - http://www.ugidotnet.org
UGISS - http://www.ugiss.org

Vincenzo Morgante

unread,
Mar 13, 2003, 11:59:41 AM3/13/03
to
> Lorenzo Benaglia
> Microsoft MVP - SQL Server
>
> UGIdotNET - http://www.ugidotnet.org
> UGISS - http://www.ugiss.org

sei un mago... ma non mi spiego sta cosa....

Lorenzo Benaglia

unread,
Mar 13, 2003, 12:19:04 PM3/13/03
to
"Vincenzo Morgante" <vmor...@NOSPAMhotmail.com> wrote in message
news:Xns933DB738921C9vm...@207.46.248.16...

Ciao Vincenzo,

> sei un mago... ma non mi spiego sta cosa....
>

Si, sono il mago Casanova :-))

Guarda, le mie sono solo supposizioni, ma credo che la Flex Grid "vada in
palla" quando riceve + messaggi indicanti il numero di righe restituire da
un result set.
La SELECT INTO *non* restituisce un result set ma restituisce anch'essa il
numero di righe (QA tab Messages)...
Quindi la stored procedure restituisce 1 result set (la SELECT su #Tabella)
con 2 counts (il primo della SELECT INTO ed il secondo della SELECT * FROM
#Tabella).

Le tabelle temporanee non c'entrano.

CREATE PROCEDURE spProvaTabellaTemporanea
AS

SELECT *
INTO Tabella
FROM Northwind.dbo.Customers

SELECT *
FROM Tabella

RETURN 0

Anche questa procedura genera l'errore:
"The Hierarchical FlexGrid does not support the requested type of data
binding."

Mettendo una NOCOUNT ritorna a funzionare.
Leggi attentamente il paragrafo "SET NOCOUNT"
URL:tsqlref.chm::/ts_set-set_3ed0.htm sui Books Online.

Ciao!

--

Vincenzo Morgante

unread,
Mar 14, 2003, 10:38:13 AM3/14/03
to
"Lorenzo Benaglia" <lbenagl...@tin.it> scritto in news:b4qei8$2324ba
$1...@ID-154627.news.dfncis.de:

LETTO E RILETTO DOPO AVER CAPITO GRAZIE A TE LA SOLUZIONE.

0 new messages