Сложные типы не показывают результата для хранимой процедуры - PullRequest
2 голосов
/ 16 апреля 2019

У меня есть хранимая процедура, которую я хотел бы использовать в Web API (C #).Я должен что-то пропустить, так как я не получаю никакого результата ни в Complex Types (в модели EF), ни в Functions Imports (я вижу хранимую процедуру в Functions Imports, но она не возвращает никакого значения, как ожидалось).

Это моя хранимая процедура (я стер некоторые не важные данные, чтобы сделать их короче)

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


    @main_id BIGINT, 
    @id_ze_mish BIGINT, 
    @id_nof BIGINT, 
    @loggedInUser VARCHAR(20) 
AS
BEGIN
    SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION [TransactionUniteSingles]

OPEN SYMMETRIC KEY io_key DECRYPTION BY CERTIFICATE chn_cert

    -- Step 1
    UPDATE [dbo].[t1]
    SET deleted = 1,
    WHERE id_nof = @id_nof
      AND id_ze  = @id_ze_mish

    -- Step 2
    UPDATE [dbo].[t_no_nir]
    SET update_stamp = GETDATE(),
        [user_name] = @loggedInUser
    WHERE id_nof = @id_nof
      AND ms_zehut_mazmin  = @id_ze_mish 

    -- Step 3
    CREATE TABLE #mainPrice
    (
         id INT,
         fName VARCHAR(20),
         lName VARCHAR(20)
    )

    INSERT INTO #mainPrice 
        EXEC  [dbo].[io_sp_get_some_data_foo] @id

    IF(EXISTS(select * from #mainPrice))
    BEGIN
        DECLARE @totalAmount INT;

        SELECT @totalAmount = (main_price + price_tip + price_visa) 
        FROM #mainPrice

        DROP TABLE #mainPrice

        UPDATE [dbo].[t_4] 
        SET amount = @totalAmount,
            update_stamp = GETDATE(),
            [user_name] = @loggedInUser
        WHERE id_nof = @id_nof
          AND id  = @main_id

    CLOSE ALL SYMMETRIC KEYS

    COMMIT TRANSACTION [TransactionUniteSingles]      
    SELECT CAST(1 as BIT) as 'Status', 'Succeeded' as 'ReturnMessage'
    END
ELSE
    BEGIN
    SELECT CAST(0 as BIT) as 'Status', 'ADMIN - Unite Singles as 'ReturnMessage'       
    END 
END TRY

BEGIN CATCH
ROLLBACK TRANSACTION [TransactionUniteSingles]
SELECT CAST(0 as BIT) as 'Status', 'ADMIN - Unite Singles' as 'ReturnMessage'       
END CATCH

END

Обратите внимание - при запуске хранимой процедуры как отдельной, она работает отлично ивернуть то, что ожидалось.

Ответы [ 3 ]

0 голосов
/ 16 апреля 2019

Попробуйте следующее:

-- declare table at SP begin
DECLARE @ResultTable TABLE(
    Status BIT NOT NULL,
    ResultMessage NVARCHAR(50) NOT NULL
)

-- insert data where you need
INSERT INTO @ResultTable
(
    Status,
    ResultMessage
)
VALUES
(   NULL, -- Status - bit
    N''   -- ResultMessage - nvarchar(50)
    )

-- at SP end select result from table
SELECT * FROM @ResultTable

0 голосов
/ 16 апреля 2019

Я обнаружил, что моя проблема с моей временной таблицей. при использовании SET FMTONLY OFF в верхней части моего SP или над временной таблицей (в моем случае #mainPrice) все работает как чудо, и внезапно Complex Types показывает мой SP.

Другое решение - использовать таблицу переменных: DECLARE TABLE @mainPrice. Оба делают работу.

Я буду рад узнать, почему это происходит и почему C # отказался получить временную таблицу как часть моего SP, но в данный момент я нашел необходимое решение.

0 голосов
/ 16 апреля 2019

Проверьте, что происходит, когда вы вызываете вашу процедуру с входными параметрами NULL.Если результат не является таблицей, EF не будет генерировать комплексный результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...