Risultato di SP SQL in query

venerdì 29 luglio 2005 - 11.46

i-see Profilo | Newbie

Ciao a tutti
ho organizzato una sp con l'utilizzo del cursore e elaborazione dei singoli record avendo bisogno del risultato di un'altra sp.
volevo rendere più veloce il codice, inserendo il risultato della sp in una query, evitando l'utilizzo del cursore, ma non riesco a trovare negli help come aiuti sul codice da utilizzare.
c'è qualche buon anima che mi può dare una mano?

PS. tra l'altro mi sembra di aver già risolto il prob. in un lontano passato, ma non riesco più a trovare il codice

lbenaglia Profilo | Guru

> c'è qualche buon anima che mi può dare una mano?

Ciao,

posta un esempio completo, con la struttura delle tabelle (CREATE TABLE...), alcune righe di prova (INSERT INTO...), il codice delle stored procedure (CREATE PROCEDURE...) ed il result set finale che intendi ottenere.

Ciao!

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

i-see Profilo | Newbie

ciao Lorenzo
--questo potrebbe essere un esempio

----generazione tabella di prova a_aaa
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[a_aaa]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[a_aaa]
GO

CREATE TABLE [dbo].[a_aaa] ([id_prv] [int] NOT NULL ) ON [PRIMARY]
GO
----popolamento della tabella con quattro record
insert a_aaa (id_prv) values (1)
insert a_aaa (id_prv) values (2)
insert a_aaa (id_prv) values (3)
insert a_aaa (id_prv) values (4)

----store procedure di prova
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[asp_a_aaa]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[asp_a_aaa]
GO
CREATE PROCEDURE asp_a_aaa
@id_prv int
AS
declare @res varchar(20)

set @res = @id_prv * 10

return @res
GO

risultato che vorrei ottenere dalla query, usando una select che richiami per ogni record della tabella a_aaa
la sp asp_a_aaa, dandogli come parametro l'id_prv, senza però usare il cursore

id_prv
----------- -----------
1 10
2 20
3 30
4 40

(righe interessate: 4)

select id_prv, -------richiamo di asp_a_aaa con il parametro id_prv----
from a_aaa

la:
select id_prv, exec asp_a_aaa id_prv from a_aaa

da l'errore
Server: messaggio 156, livello 15, stato 1, riga 1
Sintassi non corretta in prossimità della parola chiave 'exec'.
Server: messaggio 156, livello 15, stato 1, riga 1
Sintassi non corretta in prossimità della parola chiave 'from'.

il codice da sostituire, e che vorrei conoscere se esite, è
exec asp_a_aaa id_prv
che mi permetta di inserire nella query il risultato di asp_a_aaa

se c'è qualche cosa di non chiaro sono a disp.

tk

i-see

i-see Profilo | Newbie

sembra sia risolvibile creando una funzione, anzichè una store procedure,
in questo modo:
CREATE FUNCTION f_aaa (@id_prv int) RETURNS varchar(20)
AS
BEGIN
return @id_prv * 10
END

select id_prv, dbo.f_aaa (id_prv) from a_aaa

id_prv
----------- --------------------
1 10
2 20
3 30
4 40

(righe interessate: 4)

Ciao a tuch


i-see

lbenaglia Profilo | Guru

>CREATE PROCEDURE asp_a_aaa
> @id_prv int
>AS
> declare @res varchar(20)
>
> set @res = @id_prv * 10
>
>return @res
>GO

Ciao i-see,

le stored procedures possono restituire come valore di ritorno solo interi.
Nel tuo esempio dichiari @res come stringa, pertanto verranno effettuati 2 cast impliciti:

- Il primo quando assegni a @res il risultato di @id_prv * 10 (da int a varchar)
- il secondo quando esegui la return @res (da varchar a int)

Se la sp restituirà solo interi, modifica la "declare @res varchar(20)" in "declare @res int"

>risultato che vorrei ottenere dalla query, usando una select
>che richiami per ogni record della tabella a_aaa
>la sp asp_a_aaa, dandogli come parametro l'id_prv, senza però
>usare il cursore

L'unico modo che mi viene in mente consiste nel trasformare la stored procedure in una funzione scalare come nel seguente esempio:

USE tempdb
GO

/* Definisco la tabella dbo.myTable */
CREATE TABLE dbo.myTable(
id_prv int NOT NULL
)
GO
/* La popolo */
INSERT dbo.myTable VALUES(1)
INSERT dbo.myTable VALUES(2)
INSERT dbo.myTable VALUES(3)
INSERT dbo.myTable VALUES(4)
GO

/* Definisco l'UDF dbo.ufn_MultiplyBy10 */
CREATE FUNCTION dbo.ufn_MultiplyBy10(
@id_prv int
)
RETURNS int
BEGIN
DECLARE @res int
SET @res = @id_prv * 10
RETURN @res
END
GO

/* Query */
SELECT id_prv, dbo.ufn_MultiplyBy10(id_prv) AS MultiplyBy10
FROM dbo.myTable
GO

/* Output:

id_prv MultiplyBy10
----------- ------------
1 10
2 20
3 30
4 40

(4 row(s) affected)

*/

/* Pulizia */
DROP FUNCTION dbo.ufn_MultiplyBy10
DROP TABLE dbo.myTable

>la:
>select id_prv, exec asp_a_aaa id_prv from a_aaa
>
>da l'errore
>Server: messaggio 156, livello 15, stato 1, riga 1
>Server: messaggio 156, livello 15, stato 1, riga 1
>
>il codice da sostituire, e che vorrei conoscere se esite, è
>exec asp_a_aaa id_prv

No, questa sintassi non è corretta.
Esiste una sintassi simile solo per il comando di INSERT:

INSERT...
EXEC...

>se c'è qualche cosa di non chiaro sono a disp.
No, sei stato chiarissimo :-)

Ciao!

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

i-see Profilo | Newbie

ti ringrazio Lorenzo
ma penso di aver risolto con l'utilizzo delle funzioni, come ho indicato nel precedente post
devo dire che ne conoscevo l'esistenza, ma non ne avevo mai intuito le possibilità.
le funzioni possono restituire formati diversi.
comunque grazie ancora
ciao

i-see
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