Problemi con tabelle temporanee in function

lunedì 13 luglio 2009 - 15.17

cicemoi Profilo | Junior Member

Salve,
ho creato una funzione che in base in base ai suoi parametri in ingresso fa un query che ritorna una serie di record da un campo che dovrei concatenare e restituire all'utente sotto forma di stringa
sto procedendo in questo modo:

set @strsql = 'select descrizione from ' + @tabBusiness + ' where id_' + @campoIdTabella + ' in (' + @listInfo + ') '

create table #tmpBus
(
descrizione varchar(50) COLLATE Latin1_General_CI_AS
)

insert into #tmpBus exec sp_executesql @strsql

set @strsql = 'select * from #tmpBus '
EXECUTE sp_executesql @strsql

DECLARE cursoreItems INSENSITIVE cursor for
select * from #tmpBus

OPEN cursoreItems
FETCH NEXT
FROM cursoreItems
INTO @descrizioneItem

WHILE @@FETCH_STATUS = 0
BEGIN
set @info = @info + @descrizioneItem + ','

FETCH NEXT
FROM cursoreItems
INTO @descrizioneItem

end

drop table #tmpBus

sembra tutto corretto ma nel momento in cui lo inserisco nella funzione mi da il seguente errore "Cannot access temporary tables from within a function"
Come posso ovviare questo problema?????

grazie mille
Cinzia Cipriano

lbenaglia Profilo | Guru

>sembra tutto corretto ma nel momento in cui lo inserisco nella
>funzione mi da il seguente errore "Cannot access temporary tables
>from within a function"
>Come posso ovviare questo problema?????

Ciao Cinzia,

All'interno di una UDF non può né usare il dynamic SQL né definire e/o accedere a tabelle temporanee.
Inoltre il concatenamento di stringhe puoi ottenerlo in modo più elegante ed efficiente senza ricorrere ai cursori:
http://groups.google.it/group/microsoft.public.it.sql/msg/8887e519f7eb28a1?hl=it

>grazie mille
Prego.

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

cicemoi Profilo | Junior Member

per ovviare quindi l'uso del cursore e ancora di più l'uso delle tabelle temporanee ho scelto la seguente semplice strada

set @strsql = 'select ' + @info + ' = ' + @info + ' + convert(varchar(400), Descrizione ) + '',''
from ' + @tabBusiness +
' where id_' + @campoIdTabella + '
in (' + @listInfo + ') '

exec sp_executesql @strsql

ritornando poi il parametro @info come output ma incorro nel seguente errore:
"Only functions and extended stored procedures can be executed from within a function"
sapreste darmi una dritta?

Grazie
Cinzia Cipriano

lbenaglia Profilo | Guru

>per ovviare quindi l'uso del cursore e ancora di più l'uso delle
>tabelle temporanee ho scelto la seguente semplice strada
>
>set @strsql = 'select ' + @info + ' = ' + @info + ' + convert(varchar(400),
>Descrizione ) + '',''
> from ' + @tabBusiness +
> ' where id_' + @campoIdTabella + '
> in (' + @listInfo + ') '
>
>exec sp_executesql @strsql
>
>ritornando poi il parametro @info come output ma incorro nel
>seguente errore:
>"Only functions and extended stored procedures can be executed
>from within a function"
>sapreste darmi una dritta?
Si, che senso ha comporre in quel modo il comando di SELECT?
Perderesti tutti i vantaggi offerti dalle UDF col il rischio di subire attacchi di SQL Injection.
L'unica parte che puoi rendere parametrica è la clausola WHERE, specificando il valore dei parametri (non la lista delle colonne).
Inoltre ti ho già detto che nelle UDF NON puoi utilizzare il Dynamic SQL.

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
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