0

I don't know EF so well so I'm really stucked.

My purpose is create a complex type object in my repository layer from a stored procedure, usually the process is really easy:

  • Update Model from database

  • double click on the selected stored procedure

  • press the button "Get Column Information" in Add Import Function form

  • Then, press the button "Create new complex type"

At this point EF has created my object type in my repository layer.

My problem is the following:

In my TSQL Code I have a lot of queries, SELECT, INSERT, Etc.. but my result it should be the last SELECT executed, instead EF gets the first one executed.

How can I get the right query?

EDIT:

Here the SP:

    GO
    /****** Object:  StoredProcedure [dbo].[sp_CreaTestataOrdine]    Script Date: 09/15/2013 12:08:30 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:      <Author,,Name>
    -- Create date: <Create Date,,>
    -- Description: <Description,,>
    -- =============================================
    ALTER PROCEDURE [dbo].[sp_CreaTestataOrdine] (
    @LOGIN varchar(20), 
   [...] -- A LOT OF PARAMS

    )
    AS
    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;

        DECLARE @TMAMN varchar(6), 
        [...] -- A LOT OF DECLARATIONS

    DECLARE @tab TABLE (id_doc bigint, num_ordine varchar(7))


    SELECT @TMAMN = 'TMAMN', @TMAV2 = 'TMAV2', @TMAVR = 'TMAVR', @TMAVR = 'TMAVR', @TMAIN = 'TMAIN', @TMNMA = 'TMNMA', @TMNV2 = 'TMNV2', @TMNVR = 'TMNVR', @TV2MA = 'TV2MA', @TV2MN = 'TV2MN', @TV2VR = 'TV2VR', @TVRMA = 'TVRMA', @TVRMN = 'TVRMN', @TVRV2 = 'TVRV2', @TMAM2 = 'TMAM2', @TMNM2 = 'TMNM2', @TVRM2 = 'TVRM2', @TV2M2 = 'TV2M2', @TM2MA = 'TM2MA', @TM2MN = 'TM2MN' , @TM2VR = 'TM2VR' , @TM2V2 = 'TM2V2', @OVW1 = 'OVW1', @OVW2 = 'OVW2', @OVW3 = 'OVW3', @MAG_MARMIROLO = '2', @MAG_MANTOVA = '3', @MAG_INTERNET = '6', @MAG_VERONA = '4', @MAG_VERONA2 = '5', @MAG_MANTOVA2 = '8' 

SELECT * FROM utenti WHERE login = @LOGIN

IF @@ROWCOUNT > 0 
BEGIN

    SELECT @nome_ord = nome, @cognome_ord = cognome, @cod_fiscale_ord = codice_fiscale, @p_iva_ord = p_iva, @indirizzo_ord = indirizzo, @cap_ord = cap, @localita_ord = localita, @stato_ord = stato, @prov_ord = provincia, @tel_fisso = tel_fisso, @tel_cell = tel_cell, @email_ord = email, @cod_cliente = cod_cliente FROM utenti WHERE login = @LOGIN


END


IF @DEST_DIVERSA = 1
BEGIN

    SELECT @nome_ord = @nome_dest, @cognome_ord = @cognome_dest, @indirizzo_ord = @indirizzo_dest, @cap_ord = @cap_dest, @localita_ord = @localita_dest, @prov_ord = @provincia_dest, @tel_fisso = @telefono_dest, @email_ord = @email_dest

    SELECT * FROM spedizioni WHERE id_spedizione = @paese_dest_id
    IF @@ROWCOUNT > 0
    BEGIN   

        SELECT @stato_ord = nazione, @cod_iva_id = fk_cod_iva_id FROM spedizioni WHERE id_spedizione = @paese_dest_id

    END
END         

IF @cod_iva_id = ''
BEGIN
    SELECT @cod_iva_id = NULL
END

SELECT * FROM lk_codici_iva WHERE cod_iva_id = @cod_iva_id
IF @@ROWCOUNT > 0
BEGIN   
    SELECT @cod_iva_perc = cod_iva_perc, @cod_iva_descr = cod_iva_descr FROM lk_codici_iva WHERE cod_iva_id = @cod_iva_id
END

--la richiesta fattura è possibile solo se il cliente e la destinazione sono Italia
IF @richiesta_fattura = 1 AND @cod_iva_descr = '20'
BEGIN
    SELECT * FROM spedizioni WHERE id_spedizione = @paese_fatt_id
    IF @@ROWCOUNT > 0
    BEGIN
        SELECT @paese_fatt = nazione FROM spedizioni WHERE id_spedizione = @paese_fatt_id
    END
END 

IF @cod_iva_descr = 'A41'
BEGIN
    SELECT @causale_documento = @OVW2
END
ELSE IF @cod_iva_descr = 'A8'
BEGIN
    SELECT @causale_documento = @OVW3
END
ELSE IF @cod_iva_descr = '20'
BEGIN
    SELECT @causale_documento = @OVW1
END

SELECT @importo_iva = 0, @importo_imponibile = 0, @importo_contrassegno = NULL

IF @pagamento = 'Contrassegno'
BEGIN
    SELECT @importo_contrassegno = 5.0
    --calcolo l'imponibile sulle spese di contrassegno
    SELECT @importo_imponibile = @importo_imponibile + ((@importo_contrassegno * 100) / (100 + @cod_iva_perc))  

    SELECT @importo_totale = @importo_totale + @importo_contrassegno
END 

--calcolo l'imponibile sulle spese di spedizione
SELECT @importo_imponibile = @importo_imponibile + ((@spese_spedizione * 100) / (100 * @cod_iva_perc))  

IF @Standard = 1
BEGIN
    SELECT @mod_spedizione = 'Standard'
END
ELSE IF @Express = 1
BEGIN 
    SELECT @mod_spedizione = 'Express'
END
ELSE IF @Expedited = 1 
BEGIN
    SELECT @mod_spedizione = 'Expedited'
END

--imposto il numeratore per l'ordine di vendita generico
SELECT * FROM causali_documenti INNER JOIN numeratori ON fk_caus_doc_num = caus_doc_num WHERE caus_doc = @causale_documento
IF @@ROWCOUNT > 0
BEGIN
    SELECT @caus_doc_caus_mov1 = caus_doc_caus_mov1, @caus_doc_num = caus_doc_num, @descr_causale = caus_doc_descr, @num_progr = (num_progr + 1)  FROM causali_documenti INNER JOIN numeratori ON fk_caus_doc_num = caus_doc_num WHERE caus_doc = @causale_documento

END 

SELECT @num_ordine = dbo.StringAddZero(@num_progr, 7)   


--nel caso di bonifico e contrassegno l'ordine è da considerarsi definitivo quindi si applicano i movimenti di magazzino
IF @pagamento = 'Bonifico' OR @pagamento = 'Contrassegno'
BEGIN

    EXEC @cod_doc_def = sp_ProgressivoDoc

    BEGIN TRAN

    INSERT INTO documenti_testata(id_doc, [login], fk_caus_doc, descr_causale, cod_cliente, ragsoc_cliente, data_creazione, data_modifica, anno, num_ord_v, mod_pagamento, mod_spedizione, mod_contrassegno, utente, importo_spedizione, importo_contrassegno, importo_totale, fk_cod_iva_id, dest_diversa, cognome_dest, nome_dest, email_dest, indirizzo_dest, provincia_dest, cap_dest, localita_dest, telefono_dest, stato_dest, stato_usa_dest, richiesta_fattura, indirizzo_fatt, provincia_fatt, cap_fatt, localita_fatt, stato_fatt, stato_usa_fatt, p_iva_fatt, cod_fiscale_fatt) VALUES (@cod_doc_def, @LOGIN, @causale_documento, @descr_causale, @cod_cliente, @rag_soc, getdate(), getdate(), year(getdate()), @num_ordine, @pagamento, @mod_spedizione, @pag_contrassegno, @LOGIN, @spese_spedizione, @importo_contrassegno, @importo_totale, @cod_iva_id, @DEST_DIVERSA, @cognome_ord, @nome_ord, @email_ord, @indirizzo_ord, @prov_ord, @cap_ord, @localita_ord, @tel_fisso, @stato_ord, @stato_usa, @richiesta_fattura, @indirizzo_fatt, @provincia_fatt, @cap_fatt, @localita_fatt, @paese_fatt, @stato_usa_fatt, @p_iva, @cod_fiscale_fatt)

    UPDATE numeratori SET num_progr = num_progr + 1 WHERE caus_doc_num = @caus_doc_num

    IF (@@ERROR <> 0)
    BEGIN
        ROLLBACK TRAN
        --RETURN 1
    END 

    COMMIT TRAN

    INSERT @tab VALUES(@cod_doc_def, @num_ordine)

    SELECT * FROM @tab

END

-- nel caso di Paypal o della carta di credito occorre aspettare la conferma della transazione per rendere definitivo l'ordine pertanto carico l'ordine nella tabella temporanea
ELSE IF @pagamento = 'Paypal' OR @pagamento = 'Carta' OR @pagamento = 'Carta2'  
BEGIN

    BEGIN TRAN

    SET NOCOUNT ON; 
    INSERT INTO tmp_documenti_testata([login], fk_caus_doc, descr_causale, cod_cliente, ragsoc_cliente, data_creazione, data_modifica, anno, num_ord_v, mod_pagamento, mod_spedizione, mod_contrassegno, utente, importo_spedizione, importo_contrassegno, importo_totale, fk_cod_iva_id, dest_diversa, cognome_dest, nome_dest, email_dest, indirizzo_dest, provincia_dest, cap_dest, localita_dest, telefono_dest, stato_dest, stato_usa_dest, richiesta_fattura, indirizzo_fatt, provincia_fatt, cap_fatt, localita_fatt, stato_fatt, stato_usa_fatt, p_iva_fatt, cod_fiscale_fatt) VALUES (@LOGIN, @causale_documento, @descr_causale, @cod_cliente, @rag_soc, getdate(), getdate(), year(getdate()), @num_ordine, @pagamento, @mod_spedizione, @pag_contrassegno, @LOGIN, @spese_spedizione, @importo_contrassegno, @importo_totale, @cod_iva_id, @DEST_DIVERSA, @cognome_ord, @nome_ord, @email_ord, @indirizzo_ord, @prov_ord, @cap_ord, @localita_ord, @tel_fisso, @stato_ord, @stato_usa, @richiesta_fattura, @indirizzo_fatt, @provincia_fatt, @cap_fatt, @localita_fatt, @paese_fatt, @stato_usa_fatt, @p_iva, @cod_fiscale_fatt); 

    SELECT @cod_doc_tmp = SCOPE_IDENTITY();

    UPDATE numeratori SET num_progr = num_progr + 1 WHERE caus_doc_num = @caus_doc_num

    IF (@@ERROR <> 0)
    BEGIN
        ROLLBACK TRAN
        --RETURN 1
    END 

    COMMIT TRAN

    INSERT @tab VALUES(@cod_doc_tmp, @num_ordine)

     SELECT * FROM @tab **-- I WANT THIS ONE!!!!!**

END


END

PS: This SP is not Mine is a legacy

1 Answer 1

1

The best way is to replace @@ROWCOUNT:

SELECT * FROM utenti WHERE login = @LOGIN
IF @@ROWCOUNT > 0 

using instead a local variable @ROWCOUNT:

-- ... at the start of your SP...
DECLARE @ROWCOUNT AS INT

-- ... in all your SELECT...
SELECT @ROWCOUNT = COUNT(*) FROM utenti WHERE login = @LOGIN
IF @ROWCOUNT > 0 

using a variable name like @ROWCOUNT can help you with the refactoring and to mantain the same structure.

Sign up to request clarification or add additional context in comments.

1 Comment

Yes, it should works I'll check immediately. I will use SELECT @ROWCOUNT = ISNULL((SELECT COUNT(*) FROM utenti WHERE login = @LOGIN),0)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.