EDMX, возвращающий int вместо ObjectResult или columnlist или метаданных - PullRequest
0 голосов
/ 16 октября 2019

Хранимая процедура SQL возвращает int вместо ObjectResult или ColumnList или Metadata при обновлении этой хранимой процедуры в EDMX.

Я попытался, установив SET FMTONLY OFF в начале хранимой процедуры, удалил все RowCounts в хранимой процедуре, но, к сожалению, это не сработало.

USE [DBNAME]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [API].[GETTest]
(
@I_MSA NVARCHAR(8) = NULL,
@I_PAYEE VARCHAR(8) = NULL,
@I_LOGINID VARCHAR(50) = NULL,
@PAYEE_COUNT INT OUTPUT
)
AS ; BEGIN
DECLARE @COUNT INT,
        @ROW INT,
        @LV_PAYEE VARCHAR(10);  
--testing
CREATE TABLE #TempTable1 (ACCOUNT_TYPE VARCHAR(2), MASTER_DATA VARCHAR(10), MASTER_DESC VARCHAR(50));
CREATE TABLE #TempTable2 (ACCOUNT_TYPE VARCHAR(2), MASTER_DATA VARCHAR(10), MSA_NUM NVARCHAR(8), MASTER_DESC VARCHAR(50));
CREATE TABLE #TempTable3 (ACCOUNT_TYPE VARCHAR(2), MASTER_DATA VARCHAR(10));

-- Adding this part to get the metadata of the columns results
IF (1=0)
    BEGIN
        SET FMTONLY OFF
    END

/* SET INPUT PARAMETERS*/
SET @I_MSA = RIGHT('0000000' + @I_MSA,7); -- PADDING ZEROS IN FRONT
SET @LV_PAYEE = RIGHT('0000000000' + @I_PAYEE,10); -- PADDING ZEROS IN FRONT
SET @I_LOGINID = UPPER(@I_LOGINID); -- CONVERTING THE LOGIN ID TO UPPER CASE

/* RETRIEVE DATA IF MSA IS PROVIDED */
IF @I_MSA IS NOT NULL
    BEGIN
        BEGIN TRY
            INSERT INTO #TempTable1
            EXEC API.GET_MSA_LOGIN_REPORT
            @IS_MSA_NUMBER = @I_MSA,
            @IS_ACCOUNT_TYPE = 'PA', -- PAYEE ACCOUNT TYPE
            @IS_ROWCOUNT = @COUNT OUTPUT;
        END TRY

        /* Catch the Error Message and Suppress it */
        BEGIN CATCH
        -- Suppress the Error message we are getting from Source Stored Procedure
        END CATCH

        /* GET DATA IN TEMPORARY TABLE #TempTable3 IF @COUNT IS > 0 */
        IF @COUNT > 0
            BEGIN
                INSERT INTO #TempTable3
                SELECT ACCOUNT_TYPE,
                       MASTER_DATA
                  FROM #TempTable1
                /* ASSIGN THE ROW COUNT OF #TempTable3 TO @ROW */
                SELECT @ROW = @@ROWCOUNT;
                DROP TABLE #TempTable1;
            END
    END

/* RETRIEVE DATA IF LOGIN ID IS PROVIDED */
ELSE IF @I_LOGINID IS NOT NULL
    BEGIN
    BEGIN TRY
        INSERT INTO #TempTable2
        EXEC API.GET_MSA_AGENT_REPORT
        @IS_AGENT_ID     = @I_LOGINID,
        @IS_ACCOUNT_TYPE  = 'PA', -- PAYEE ACCOUNT TYPE 
        @IS_ROWCOUNT = @COUNT OUTPUT;
    END TRY

    /* CATCH THE ERROR MESSAGE AND SUPPRESS IT */
    BEGIN CATCH  
      -- IF LOGIN ID IS NOT AVAILABLE IN MSA AGENT THEN CHECK IT IN MSA LOGIN STORED PROCEDURE
      --RAISERROR('LOGIN ID IS NOT AVAILABLE IN MSA AGENT PROCEDURE',1,1);
    END CATCH

    /* GET DATA IN TEMPORARY TABLE #TempTable3 IF @COUNT IS > 0 */
    IF @COUNT > 0
        BEGIN
            INSERT INTO #TempTable3
            SELECT ACCOUNT_TYPE,
                   MASTER_DATA
              FROM #TempTable2
            /* ASSIGN THE ROW COUNT OF #TempTable3 TO @ROW */
            SELECT @ROW = @@ROWCOUNT;
            DROP TABLE #TempTable2;
        END


    ELSE -- @COUNT IS 0
        /* FETCH DATA FROM MSA LOGIN */
        BEGIN 
            BEGIN TRY
                INSERT INTO #TempTable1
                EXEC API.GET_MSA_LOGIN_REPORT
                @IS_LOGIN_ID = @I_LOGINID,
                @IS_ACCOUNT_TYPE = 'PA', -- PAYEE ACCOUNT TYPE
                @IS_ROWCOUNT = @COUNT OUTPUT;
            END TRY

            /* Catch the Error Message and Suppress it */
            BEGIN CATCH
            -- Suppress the Error message we are getting from Source Stored Procedure
            END CATCH

            /* GET DATA IN TEMPORARY TABLE #TempTable3 IF @COUNT IS > 0 */
            IF @COUNT > 0
                BEGIN
                    INSERT INTO #TempTable3
                    SELECT ACCOUNT_TYPE,
                           MASTER_DATA
                      FROM #TempTable1
                    /* ASSIGN THE ROW COUNT OF #TempTable3 TO @ROW */
                    SELECT @ROW = @@ROWCOUNT;
                    DROP TABLE #TempTable1;
                END 
        END
    END
/* IF PAYEE IS POPULATED */
ELSE IF @LV_PAYEE IS NOT NULL       
BEGIN
  INSERT INTO #TempTable3 VALUES ('PA', @LV_PAYEE)
  /* ASSIGN THE ROW COUNT OF #TempTable3 TO @ROW */
  SELECT @ROW = @@ROWCOUNT;                     
END

/* GET THE PAYEE INFO BASED ON PAYEE ID #TempTable3 */
IF @ROW > 0
    BEGIN
        SELECT B.ZMDIV AS 'DIVISION',
               C.DIVISIONTXT AS 'DIV_NAME',
               A.PERNR AS 'PAYEE',
               A.ENAME AS 'PAYEE_NAME' 
          FROM #TempTable3 AS E
         INNER JOIN SAP.PA0001 AS A
            ON RIGHT(E.MASTER_DATA,8) = A.PERNR
         INNER JOIN SAP.ZMTMDM_PROD_DIV AS B        
            ON A.ZZPRO = B.PRODUCER_NUM                                  
         INNER JOIN SAP.ZMTMDM_DIVISION AS C
            ON B.ZMDIV = C.DIVISION
         WHERE A.BUKRS > '1000'
           AND A.BEGDA <= CONVERT(NVARCHAR, GETDATE(),112)
           AND A.ENDDA >= CONVERT(NVARCHAR, GETDATE(),112)
           AND B.VALID_FROM <= CONVERT(NVARCHAR, GETDATE(),112)
           AND B.VALID_TO >= CONVERT(NVARCHAR, GETDATE(),112)
        /* GET THE COUNT OF THE PAYEE DETAILS */
        SELECT @PAYEE_COUNT = @@ROWCOUNT;

        /* DROP TABLE #TempTable3 */
        DROP TABLE #TempTable3;

        /* IF PAYEE DETAILS EXIST THEN DISPLAY ELSE THROW ERROR */
        --IF @PAYEE_COUNT <= 0
        --  BEGIN
        --    RAISERROR('No payee information exists for entered input',11,1)
        --  END
    END
ELSE
    SELECT @PAYEE_COUNT = 0;
    --BEGIN
    --  RAISERROR('Entered input information is incorrect',11,1);
    --END
END

Во время обновлениявышеупомянутая хранимая процедура SQL в EDMX обновляется как int вместо ObjectResult

как этот

public virtual int GETTest(string i_MSA, string i_PAYEE, string i_LOGINID, ObjectParameter pAYEE_COUNT)

вместо чего-то подобного

public virtual ObjectResult<GETTest_Result> GETTest(string i_MSA, string i_PAYEE, string i_LOGINID, ObjectParameter pAYEE_COUNT)

Я ценюлюбая помощь.

...