Di seguito una funziona che accetta dei parametri e restituisce, in questo caso, un record di una tabella :
CREATE FUNCTION dbo.VLISTDATA (@Codice CHAR(5), @Articolo CHAR(30), @Data CHAR(8) )
RETURNS TABLE
AS
RETURN
(
SELECT * FROM TABRILIS
WHERE CODICE=@Codice
AND ARTICOLO=@Articolo
AND DATAINVALI = (
SELECT MAX(DATAINVALI) DATAINVALI FROM TABRILIS
WHERE CODICE=@Codice
AND ARTICOLO=@Articolo
AND DATAINVALI <= @Data
)
)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM TABRILIS
WHERE CODICE=@Codice
AND ARTICOLO=@Articolo
AND DATAINVALI = (
SELECT MAX(DATAINVALI) DATAINVALI FROM TABRILIS
WHERE CODICE=@Codice
AND ARTICOLO=@Articolo
AND DATAINVALI <= @Data
)
)
L'interessante è però come mettere in JOIN questa funzioni con altre tabelle.
Non è possibile utilizzare una normale JOIN ma è necessario utilizzare una CROSS APPLY come nell'esempio sotto:
select M.ARTICOLO,M.EPRLORDO,PIPPO.PREZZO
from TESDOCUM T INNER JOIN MOVIMAG M ON T.NUMERO=M.NUMERO
INNER JOIN ANAMAGA A ON M.ARTICOLO=A.CODICE
INNER JOIN CLIFO ON T.CLI_FOR=CLIFO.CODICE
INNER JOIN CFVEN ON T.CLI_FOR=CFVEN.CODCF
Cross apply VLISTDATA(CFVEN.CODLIST,M.ARTICOLO,T.DATAPROTOC) PIPPO
Nell'esempio viene richiamata la funzione VLISTDATA per ogni riga del documento passandogli il codice listino del cliente, il codice articolo e la data del movimento.
La funzione restituisce tutti i campi della tabella TABRILIS con il record corrispondente alla data passata.
La funzione restituisce tutti i campi della tabella TABRILIS con il record corrispondente alla data passata.
NB. L'esempio di cui sopra è solo accademia per Sigla ed è inutile in quanto tale dato si trova già nel campo EPRLISTINO di MOVIMAG
Testato sul Sql Server 2016
link :
https://dba.stackexchange.com/questions/86143/how-to-join-a-table-with-a-table-valued-function
https://docs.microsoft.com/it-it/sql/t-sql/queries/from-transact-sql?view=sql-server-ver15
Nessun commento:
Posta un commento