Хранимая процедура, которая возвращает значение только для одной строки - PullRequest
0 голосов
/ 22 апреля 2020

Где-то мне просто нужно передать primary key персонала, найти его в базе данных и вернуть вызывающему абоненту значение одного из столбцов этой таблицы - это столбец bit. Довольно просто, и я написал это так. Я просто хотел посмотреть, есть ли лучший способ написания хранимой процедуры для достижения той же цели или нет.

CREATE PROCEDURE [dbo].[SP_GetPersonnelInfo]
    @PersonnelPK INT
AS
BEGIN
    SET NOCOUNT ON;

    IF EXISTS(SELECT 1 FROM dbo.Personnel AS p WHERE p.PersonnelPK = @PersonnelPK)
    BEGIN
        SELECT TOP (1) p.IsTeacher From Personnel p Where p.PersonnelPK = @PersonnelPK
    END;
END;
GO

Ответы [ 3 ]

2 голосов
/ 22 апреля 2020

Да, есть лучший способ - удалить if exists - его совершенно бесполезно. Кроме того, вам не нужен top(1), поскольку первичный ключ является уникальным по определению, хранимая процедура будет возвращать только одну строку или ничего, если значение первичного ключа не найдено.

CREATE PROCEDURE [dbo].[SP_GetPersonnelInfo]
    @PersonnelPK INT
AS
    SET NOCOUNT ON;

    SELECT IsTeacher 
    FROM dbo.Personnel 
    WHERE PersonnelPK = @PersonnelPK;
GO
2 голосов
/ 22 апреля 2020

Во-первых, exists кажется излишним, поэтому:

SELECT TOP (1) p.IsTeacher From Personnel p Where p.PersonnelPK = @PersonnelPK;

Если нет подходящей строки, это не возвращает строк.

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

1 голос
/ 22 апреля 2020

Да, просто

SELECT p.IsTeacher 
FROM Personnel p 
WHERE p.PersonnelSys = @PersonnelPK

Поскольку это первичный ключ, максимум может быть только один результат, поэтому нет необходимости в TOP 1. И IF EXISTS просто не нужен, если вы можете вернуть результат напрямую.

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