Ho fatto un paio di piccole aggiunte e la SP funziona egregiamente. Purtroppo la velocità di esecuzione è praticamente identica a quella di una analogo query tradizionale che prevede l'utilizzo di un recordset.
L'utilizzo di una SP era finalizzato a velocizzare sensibilmente una certa procedura. Con il metodo tradizionale essa impiegava circa 17 secondi ad essere eseguite, mentre con la SP ci impiega .... 17 secondi. E questo anche se la si richiama più volte, sperando nell'intelligenza del motore di SQL Server; speranza vana, almeno in questo caso.
Resta, da parte mia, il fatto che ho appreso, grazie al tuo aiuto, qualcosa circa le SP.
Riporto qui di sotto la SP in questione
codice:
USE [Medart_SA2]
GO
/****** Object:  StoredProcedure [dbo].[strOrganizzaGiornata2]    Script Date: 12/07/2020 16:25:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--- 


ALTER PROCEDURE [dbo].[strOrganizzaGiornata2]  
    @strDataX varchar(10),
    @strStato varchar(2) ,
    @strSenso varchar(4) ,
    @strParametro varchar(1)
AS


BEGIN
    SET NOCOUNT ON
    
    -- per evitare SQL Injection, controlla che il parametro sia valido
    IF @strParametro NOT IN ('0', '1','2','3','4','5','6','7')
        BEGIN
        RAISERROR('@strParametro non previsto: %s', 11, 1, @strParametro);
        RETURN -1;
    END 

    -- per evitare SQL Injection, controlla che la direzione dell'ordinamento sia valido
    IF UPPER(@strSenso) NOT IN ('ASC','DESC')
        BEGIN
        RAISERROR('@strSenso non previsto: %s', 11, 1, @strSenso);
        RETURN -1;
    END 

    DECLARE @SQL AS NVARCHAR(MAX)    --    contiene la stringa da eseguire
    DECLARE @ORB AS NVARCHAR(MAX) -- contiene l'ordinamento
    
    -- costruisce la query
    SET @SQL=N'SELECT 
            D.RagioneSociale,
            D.CognomeNomeDipendente,
            D.DataSca,
            D.TipoPrestazione,
            D.Codice,
            D.Luogo,
            D.NomeMedico,
            D.Stato,
            D.ID,
            D.IDAzienda,
            D.IDDipendente,
            D.IDMedico,
            D.IDLuogoVisita,
            D.DataPre,
            D.Ora,
            D.DataRegistrazione,
            D.InServizio,
            D.DataEff,
            A.DataSospesa 
        FROM 
            TabDateDip D
            INNER JOIN TabAziende A ON D.IDAzienda = A.ID  
        WHERE 1=1
        AND D.DataSca<''@datta''           
        AND D.Stato=''@stato''
        AND D.InServizio=''S''     
        ORDER BY '

    -- stabilisce l'ordinamento in base al parametro passato
    IF @strParametro='0' BEGIN SET @ORB=N'D.RagioneSociale @verso, D.CognomeNomeDipendente, D.Codice' END
    IF @strParametro='1' BEGIN SET @ORB=N'D.CognomeNomeDipendente @verso, D.Codice' END
    IF @strParametro='2' BEGIN SET @ORB=N'D.DataSca @verso, D.RagioneSociale, D.CognomeNomeDipendente, D.Codice' END  --- modificato
    IF @strParametro='3' BEGIN SET @ORB=N'D.TipoPrestazione @verso, D.RagioneSociale, D.CognomeNomeDipendente, D.Codice' END
    IF @strParametro='4' BEGIN SET @ORB=N'D.Codice @verso, D.RagioneSociale, D.CognomeNomeDipendente' END
    IF @strParametro='5' BEGIN SET @ORB=N'D.Luogo @verso, D.RagioneSociale, D.CognomeNomeDipendente, D.Codice' END
    IF @strParametro='6' BEGIN SET @ORB=N'D.NomeMedico @verso, D.RagioneSociale, D.CognomeNomeDipendente, D.Codice' END
    IF @strParametro='7' BEGIN SET @ORB=N'D.Stato @verso, D.RagioneSociale, D.CognomeNomeDipendente, D.Codice' END

    -- cambia il verso dove è variabile (dove non è variabile resta ASC come default)
    SET @ORB=REPLACE(@ORB, '@verso', @strSenso)
    SET @SQL=REPLACE(@SQL, '@datta', @strDataX)          --- aggiunto
    SET @SQL=REPLACE(@SQL, '@stato', @strStato)          --- aggiunto  
    -- ricostruisce la query con anche l'ordinamento
    SET @SQL=@SQL + ' ' + @ORB

    -- la stampa
    PRINT  @SQL
    
    -- la esegue
    EXEC sp_executesql @SQL

END