#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: правильно — извините — скопируй и вставь остатки 😉 Исправил это , спасибо