Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
SQL Server 2000/2005/2008, Express, Access, MySQL, Oracle
Risultato di SP SQL in query
venerdì 29 luglio 2005 - 11.46
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
i-see
Profilo
| Newbie
6
messaggi | Data Invio:
ven 29 lug 2005 - 11:46
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
5.625
messaggi | Data Invio:
ven 29 lug 2005 - 12:23
> 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
6
messaggi | Data Invio:
ven 29 lug 2005 - 15:48
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
6
messaggi | Data Invio:
ven 29 lug 2005 - 16:47
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
5.625
messaggi | Data Invio:
ven 29 lug 2005 - 17:08
>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
6
messaggi | Data Invio:
ven 29 lug 2005 - 18:02
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
Torna su
Stanze Forum
Elenco Threads
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 !