SQL вызывает SP из другого SP

Могу ли я получить некоторую помощь с синтаксисом SP в SQL.

Вот мой код:

CREATE PROCEDURE usp_GetValue
(
    @ID VARCHAR(10),
    @Description VARCHAR(10)
)

AS

BEGIN
    return @ID + @Description
END

CREATE PROCEDURE usp_InsertValue
(
    @ID VARCHAR(10),
    @FirstName VARCHAR(50),
    @LastName VARCHAR(50),
    @Description VARCHAR(10),
    @Comment VARCHAR(max)
)

AS

BEGIN
    Declare @v_Value VARCHAR(15)
    Set @v_Value = usp_GetValue(@ID, @Description)

END

В SP usp_InsertValue я хочу объявить и установить переменную. После того, как переменная была объявлена, я хочу вызвать другой SP с параметрами, чтобы установить значение объявленной переменной.

Я не уверен в синтаксисе. Можно мне помочь?

ОБНОВИТЬ

Я обновил мой код выше, используя вашу функцию. Как мне установить @v_Value из функции usp_GetValue.

Я получаю эту ошибку:

usp_GetValue не является распознанным именем встроенной функции.

UPDATE2

Вот мой полный код:

CREATE PROCEDURE usp_PersonCategoryLookupTesting
(
    @ID VARCHAR(10),
    @Description VARCHAR(10),
    @res  VARCHAR(10) OUTPUT
)

AS

BEGIN
    return @ID + @Description
END

CREATE PROCEDURE usp_InsertPersonTesting
(
    @IDTest VARCHAR(10),
    @FirstName VARCHAR(50),
    @LastName VARCHAR(50),
    @AddressLine1 VARCHAR(50),
    @AddressLine2 VARCHAR(50),
    @AddressLine3 VARCHAR(50),
    @MobilePhone VARCHAR(20),
    @HomePhone VARCHAR(20),
    @Description VARCHAR(10),
    @Comment VARCHAR(max)
)

AS

BEGIN
    Declare @PersonCategory VARCHAR(15)
    EXEC usp_PersonCategoryLookupTest @ID, @Description, @PersonCategory
    INSERT INTO Person(FirstName, LastName, AddressLine1, AddressLine2, AddressLine3, MobilePhone, HomePhone, DateModified, PersonCategory, Comment)
    VALUES (@FirstName, @LastName, @AddressLine1, @AddressLine2, @AddressLine3, @MobilePhone, @HomePhone, GETDATE (), @PersonCategory, @Comment)
END

Я получаю эту ошибку в моем приложении, которое вызывает код SQL:

Ошибка преобразования при преобразовании значения varchar '123Client' в тип данных int.

Я использую значения "123" и "Клиент" для @IDTest и @Description.

2 ответа

Вы можете использовать только такую ​​функцию, а не хранимую процедуру. Хранимые процедуры возвращают только целочисленные значения.

Для SP вам нужно создать параметры для получения значений. Для этого сценария лучше создать функцию

CREATE FUNCTION usp_GetValue
(
    @ID VARCHAR(10),
    @Description VARCHAR(10),
)
RETURNS VARCHAR(50)
AS

BEGIN
    return @ID + @Description
END

Тогда назовите это:

SET @v_value = dbo.usp_GetValue('John','Doe')  --output: John Doe

Если вы настаиваете на том, что вам нужен SP, который не подходит для этого, есть 2 способа

1) Выходной параметр

CREATE PROCEDURE usp_GetValue
(
    @ID VARCHAR(10),
    @Description VARCHAR(10),
    @Result varchar(20) OUTPUT
)

AS

BEGIN
    SET @Result = @ID + @Description
END

Тогда назовите это:

    Declare @v_Value VARCHAR(15)
    Set @v_Value = EXEC usp_GetValue @ID,  @Description, @v_Value OUTPUT

2) Выберите из него

CREATE PROCEDURE usp_GetValue
(
    @ID VARCHAR(10),
    @Description VARCHAR(10)
)

AS

BEGIN
    SELECT @ID + @Description
END

Используйте это так:

declare @tempresult as table(v_value as varchar(15))

INSERT INTO @tempresult
    EXEC usp_GetValue @ID,  @Description

Select Top 1 @v_value = v_value From @tempresult

Мой совет - используйте функциональный подход.

Я думаю, что выходные параметры должны быть правильными: см. Этот пост: хранимая процедура возвращает varchar

CREATE PROCEDURE usp_GetValue
(
    @ID VARCHAR(10),
    @Description VARCHAR(10),
    @res  VARCHAR(10) OUTPUT
)

AS

BEGIN
    return @ID + @Description
END

CREATE PROCEDURE usp_InsertValue
(
    @ID VARCHAR(10),
    @FirstName VARCHAR(50),
    @LastName VARCHAR(50),
    @Description VARCHAR(10),
    @Comment VARCHAR(max)
)

AS

BEGIN
    Declare @v_Value VARCHAR(15)
    EXEC usp_GetValue @ID, @Description, @v_Value
    -- use @v_Value here...

END
Другие вопросы по тегам