Получение результата оператора Case из SQL обратно в приложение - PullRequest
0 голосов
/ 05 июня 2018

У меня есть форма, которую пользователи могут использовать для ввода серийного номера, чтобы узнать, находится ли на гарантии деталь.

warranty search

Когдаони нажимают кнопку поиска, которая подключается к базе данных, и запускает мою хранимую процедуру, которая ищет введенный ими серийный номер и проверяет столбец DATETIME с именем OFF_WARRANTY, который является датой, до которой на деталь все еще распространяется гарантия.Независимо от того, будет ли эта дата до или после @today, определяется, будет ли гарантия на деталь.

Вот моя хранимая процедура:

ALTER PROCEDURE [dbo].[WarrantyLookup] 
    -- Add the parameters for the stored procedure here
    @serialNumber VARCHAR(150),
    @warrantyStatus VARCHAR(150) OUTPUT

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

    -- Insert statements for procedure here
    DECLARE @today DATE
    SET @today = GETDATE()

    IF(SELECT COUNT(1) FROM <serial number table> WHERE SERIAL_NUMBER = @serialNumber) = 1
        SELECT OFF_WARRANTY,
            CASE
                WHEN OFF_WARRANTY >= @today THEN 'In warranty'
                WHEN OFF_WARRANTY < @today THEN 'Out of warranty'
                WHEN OFF_WARRANTY IS NULL THEN 'none'
                ELSE 'multiple'
            END
        FROM <serial number table>
        WHERE SERIAL_NUMBER = @serialNumber
END

Серийный номер может быть связан с несколькими элементамив нашей системе, поэтому первое, что я делаю, это использую Count(), чтобы убедиться, что есть только 1. Затем я пытаюсь определить гарантийный статус элементов и создал выходную переменную для этого, которая называется @warrantyStatus.

В чем я не уверен, так это в том, как точно установить @warrantyStatus на результат моего CASE оператора.На мой взгляд, я просто хочу сделать что-то довольно простое, например:

SET @warrantyStatus = <the result of my CASE statement>

Но я не знаю, как именно это напечатать?Я показал старшего разработчика в моем отделе, и он сказал что-то об использовании SqlDataReader, а затем о if(rdr.HasRows), но не совсем объяснил, как.Могу ли я использовать SqlDataReader, чтобы прочитать результаты моего заявления CASE?

Я ценю любую помощь, которую кто-либо может предложить.Я чувствую, что почти наверняка это слишком усложняю, но я просто не соединяю последние точки, чтобы сделать эту работу.

Спасибо,

Джей

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Вы поняли это почти правильно.За исключением того, что вы не можете смешивать запрос, который возвращает данные при установке переменных.Если вам нужны другие поля, то я думаю, что наиболее эффективный способ - это ВЫБЕРИТЕ результаты в @ TempTable.

SELECT 
   @warrantyStatus = 
       CASE
            WHEN OFF_WARRANTY >= @today THEN 'In warranty'
            WHEN OFF_WARRANTY < @today THEN 'Out of warranty'
            WHEN OFF_WARRANTY IS NULL THEN 'none'
            ELSE 'multiple'
       END

И наоборот, операция SET также будет работать здесь.

 SET @warrantyStatus=
    (
       SELECT
            CASE
                WHEN OFF_WARRANTY >= @today THEN 'In warranty'
                WHEN OFF_WARRANTY < @today THEN 'Out of warranty'
                WHEN OFF_WARRANTY IS NULL THEN 'none'
                ELSE 'multiple'
            END
        FROM <serial number table>
        WHERE SERIAL_NUMBER = @serialNumber
    )

Здесь вы можете вставить в таблицу @Table для возврата других строк.

DECLARE @Result TABLE
(
    OFF_WARRANTY NVARCHAR(50),
    CalcWarranty NVARCHAR(50)
)


IF(SELECT COUNT(1) FROM <serial number table> WHERE SERIAL_NUMBER = @serialNumber) = 1
INSERT @Result
SELECT 
    OFF_WARRANTY,
    CalcWarranty = 
    CASE
        WHEN OFF_WARRANTY >= @today THEN 'In warranty'
        WHEN OFF_WARRANTY < @today THEN 'Out of warranty'
        WHEN OFF_WARRANTY IS NULL THEN 'none'
        ELSE 'multiple'
    END
FROM <serial number table>
WHERE SERIAL_NUMBER = @serialNumber

SELECT @warrantyStatus = CalcWarranty FROM @Result

SELECT
    OFF_WARRANTY
FROM
    @Result  
0 голосов
/ 05 июня 2018

Почему бы просто не создать представление и использовать select?

CREATE VIEW v_warranty_stuff as
    SELECT SERIAL_NUMBER, OFF_WARRANTY,
           (CASE WHEN OFF_WARRANTY >= CAST(GETDATE() as DATE) THEN 'In warranty'
                 WHEN OFF_WARRANTY < CAST(GETDATE() as DATE) THEN 'Out of warranty'
                 WHEN OFF_WARRANTY IS NULL THEN 'none'
                 ELSE 'multiple'
            END) as warrantystatus
    FROM <serial number table>;

Тогда вы можете просто позвонить:

select warranty_status
from v_warranty_stuff
where SERIAL_NUMBER = @serialNumber;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...