0

我不太了解EF,所以我真的很困惑。

我的目的是从存储过程在我的存储库层中创建一个复杂类型的对象,通常该过程非常简单:

  • 从数据库更新模型

  • 双击选定的存储过程

  • 在添加导入功能表单中按“获取列信息”按钮

  • 然后,按下按钮“创建新的复杂类型”

此时 EF 已在我的存储库层中创建了我的对象类型。

我的问题如下:

在我的 TSQL 代码中,我有很多查询,SELECT、INSERT 等。但我的结果应该是执行的最后一个 SELECT,而不是 EF 执行的第一个。

我怎样才能得到正确的查询?

编辑:

这里是 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:这个SP不是我的,是遗产

4

1 回答 1

1

最好的方法是更换@@ROWCOUNT

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

改用局部变量@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 

使用类似的变量名@ROWCOUNT可以帮助您进行重构并保持相同的结构。

于 2013-09-16T10:04:24.550 回答