none
Problema Table Value Function RRS feed

  • Domanda

  • Ciao,

    ho scritto questa funzione:

    Use Biblioteca
    
    IF OBJECT_ID('dbo.AffittoLibri') IS NOT NULL 
    	DROP FUNCTION dbo.AffittoLibri;
    
    GO
    
    CREATE FUNCTION dbo.AffittoLibri(@CodLibro INT)
    
    	RETURNS @AffittoTable TABLE (Titolo nvarchar(20), Genere nvarchar(10), CostoG float, CostoTot int)
    
    	AS
    	BEGIN
    		DECLARE @Titolo nvarchar(20), @Genere nvarchar(10), @CostoG float, @CostoTot int
    
    		SELECT @Titolo = Titolo, @Genere=Genere, @CostoG=CostoG, @CostoTot=(DATEDIFF(DAY,DataIA,DataFA)*CostoG)
    		FROM dbo.Libro JOIN dbo.Affitto
    		ON Libro.CodLibro = Affitto.CodLibro
    		WHERE Libro.CodLibro = @CodLibro; 
    	
    
    		INSERT @AffittoTable
    		SELECT @Titolo, @Genere, @CostoG, @CostoTot;
    
    	RETURN;
    
    	END;
    
    GO
    
    SELECT Titolo,Genere,CostoG,CostoTot 
    FROM dbo.AffittoLibri(1);
    
    GO

    Non so perchè mi restituisce solo la prima riga del select.

    Se eseguo il select da solo invece funziona:

    SELECT Titolo, Genere, CostoG, (DATEDIFF(DAY,DataIA,DataFA)*CostoG)
    		FROM dbo.Libro JOIN dbo.Affitto
    		ON Libro.CodLibro = Affitto.CodLibro
    		WHERE Libro.CodLibro = 1; 


    lunedì 7 dicembre 2015 12:40

Risposte

  • Ciao,

    ti restituisce una sola riga perché la INSERT inserisce una sola riga nella tabella @AffittoTable, non potrebbe fare altrimenti visto che inserisce solo il valore delle variabili.

    per avere le righe interessate dovrai fare:

    INSERT @AffittoTable (Titolo, Genere, CostoG, CostoTot)
    SELECT Titolo, Genere, CostoG, DATEDIFF(DAY,DataIA,DataFA)*CostoG
    FROM dbo.Libro JOIN dbo.Affitto
    ON Libro.CodLibro = Affitto.CodLibro
    WHERE Libro.CodLibro = @CodLibro; 

    puoi togliere la riga "DECLARE @Titolo nvarchar(20), @Genere nvarchar(10), @CostoG float, @CostoTot int" perché non serve.

    Probabilmente la tua funzione è utilizzata per scopi accademici, a mio avviso una semplice inline user defined function credo sia più adatta allo scopo:

    Use Biblioteca
    
    IF OBJECT_ID('dbo.AffittoLibri') IS NOT NULL 
    	DROP FUNCTION dbo.AffittoLibri;
    
    GO
    
    CREATE FUNCTION dbo.AffittoLibri(@CodLibro INT)
    
    	RETURNS TABLE
    
    	AS
    	RETURN
    		(
    		SELECT Titolo, Genere, CostoG, DATEDIFF(DAY,DataIA,DataFA)*CostoG AS CostoTot 
    		FROM dbo.Libro JOIN dbo.Affitto
    		ON Libro.CodLibro = Affitto.CodLibro
    		WHERE Libro.CodLibro = @CodLibro
    		);
    GO
    
    SELECT Titolo,Genere,CostoG,CostoTot 
    FROM dbo.AffittoLibri(1);
    
    GO

    Ciao

    Giorgio Rancati


    lunedì 7 dicembre 2015 18:10
    Moderatore

Tutte le risposte

  • Ciao,

    ti restituisce una sola riga perché la INSERT inserisce una sola riga nella tabella @AffittoTable, non potrebbe fare altrimenti visto che inserisce solo il valore delle variabili.

    per avere le righe interessate dovrai fare:

    INSERT @AffittoTable (Titolo, Genere, CostoG, CostoTot)
    SELECT Titolo, Genere, CostoG, DATEDIFF(DAY,DataIA,DataFA)*CostoG
    FROM dbo.Libro JOIN dbo.Affitto
    ON Libro.CodLibro = Affitto.CodLibro
    WHERE Libro.CodLibro = @CodLibro; 

    puoi togliere la riga "DECLARE @Titolo nvarchar(20), @Genere nvarchar(10), @CostoG float, @CostoTot int" perché non serve.

    Probabilmente la tua funzione è utilizzata per scopi accademici, a mio avviso una semplice inline user defined function credo sia più adatta allo scopo:

    Use Biblioteca
    
    IF OBJECT_ID('dbo.AffittoLibri') IS NOT NULL 
    	DROP FUNCTION dbo.AffittoLibri;
    
    GO
    
    CREATE FUNCTION dbo.AffittoLibri(@CodLibro INT)
    
    	RETURNS TABLE
    
    	AS
    	RETURN
    		(
    		SELECT Titolo, Genere, CostoG, DATEDIFF(DAY,DataIA,DataFA)*CostoG AS CostoTot 
    		FROM dbo.Libro JOIN dbo.Affitto
    		ON Libro.CodLibro = Affitto.CodLibro
    		WHERE Libro.CodLibro = @CodLibro
    		);
    GO
    
    SELECT Titolo,Genere,CostoG,CostoTot 
    FROM dbo.AffittoLibri(1);
    
    GO

    Ciao

    Giorgio Rancati


    lunedì 7 dicembre 2015 18:10
    Moderatore
  • Grazie mille.
    martedì 8 dicembre 2015 09:54