Измените хранимую процедуру для возврата данных

#sql #sql-server #stored-procedures

Вопрос:

У меня есть хранимая процедура, которая ищет, есть ли у какой-либо компании такой же номер, и возвращает значение true или false, связанное с этим.

Это код моей хранимой процедуры:

 CREATE PROCEDURE [CoDb].[CompanyAttribute_RunDataValidation]
    @AttributeId INT,
    @Value VARCHAR(255),
    @ValidationType SMALLINT,
    @Operation SMALLINT,
    @CompanyId INT
AS
BEGIN
    DECLARE @ValidationSuccess AS BIT = 1

    --Create operation
    IF @Operation = 1
    BEGIN
        --Unique validation
        IF @ValidationType = 1
        BEGIN
            IF EXISTS(SELECT 1 FROM [CoDb].[CompanyAttribute] CA 
                      WHERE CA.AttributeId = @AttributeId 
                        AND CA.Value = @Value AND CA.IsDeleted = 0)
                SET @ValidationSuccess = 0
        END
    END
    --Update operation
    ELSE IF @Operation = 2
    BEGIN
        --Unique validation
        IF @ValidationType = 1
        BEGIN
            IF EXISTS(SELECT 1 FROM [CoDb].[CompanyAttribute] CA 
                      WHERE CA.AttributeId = @AttributeId 
                        AND CA.Value = @Value AND CA.CompanyId <> @CompanyId 
                        AND CA.IsDeleted = 0)
                SET @ValidationSuccess = 0
        END
    END

    SELECT @ValidationSuccess
END
 

Теперь он возвращается просто true или false .

Я хочу, чтобы он возвращал 2 значения: 1 — true или false и companyName от выбранной компании

Я переписал свою хранимую процедуру следующим образом:

 CREATE PROCEDURE [CoDb].[CompanyAttribute_RunDataValidation]
    @AttributeId INT,
    @Value VARCHAR(255),
    @ValidationType SMALLINT,
    @Operation SMALLINT,
    @CompanyId INT
AS
BEGIN
    DECLARE @ValidationSuccess AS BIT = 1
    DECLARE @CompanyName AS VARCHAR(255) = ''

    --Create operation
    IF @Operation = 1
    BEGIN
        --Unique validation
        IF @ValidationType = 1
        BEGIN
            IF EXISTS(SELECT *  
                      FROM [CoDb].[CompanyAttribute] CA 
                      INNER JOIN [CoDb].[Company] C on C.Id = CA.CompanyId 
                      WHERE CA.AttributeId = @AttributeId 
                        AND CA.Value = @Value AND CA.IsDeleted = 0)
                SET @ValidationSuccess = 0
            SET @CompanyName = 
        END
    END
    --Update operation
    ELSE IF @Operation = 2
    BEGIN
        --Unique validation
        IF @ValidationType = 1
        BEGIN
            IF EXISTS(SELECT *  
                      FROM [CoDb].[CompanyAttribute] CA 
                      INNER JOIN [CoDb].[Company] C on C.Id = CA.CompanyId 
                      WHERE CA.AttributeId = @AttributeId 
                        AND CA.Value = @Value AND CA.CompanyId <> @CompanyId 
                        AND CA.IsDeleted = 0)
                SET @ValidationSuccess = 0
        END
    END

    SELECT @ValidationSuccess
END
 

Но как я могу получить поле, например, из select CompanyName ?

Ответ №1:

Попробуйте что-нибудь вроде этого:

 --Create operation
IF @Operation = 1
BEGIN
    --Unique validation
    IF @ValidationType = 1
        IF EXISTS (SELECT *  
                   FROM [CoDb].[CompanyAttribute] CA 
                   INNER JOIN [CoDb].[Company] C ON C.Id = CA.CompanyId 
                   WHERE CA.AttributeId = @AttributeId 
                     AND CA.Value = @Value AND CA.IsDeleted = 0)
        BEGIN
            SELECT
                C.CompanyName, 0 AS ValidationSuccess
            FROM [CoDb].[Company] C 
            WHERE C.Id = @CompanyId 

            RETURN
        END
END
 

В основном вам нужно использовать a SELECT для «построения» результирующего набора, который будет возвращен в результате хранимой процедуры.

Комментарии:

1. WHERE on C.Id = @CompanyId Я думаю, здесь нам это не нужно?

2. @EugeneSukh: правильно — извините — скопируй и вставь остатки 😉 Исправил это , спасибо