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