我基于here上的示例创建了一个存储过程。但是,我得到一个错误。我在这里想念什么?
CREATE PROCEDURE SFT.usp_GetPrefix
(@p_table VARCHAR(30),
@p_prefix VARCHAR(3) OUTPUT
)
AS
BEGIN
DECLARE @lv_prefix VARCHAR(3);
SELECT @lv_prefix = SUBSTRING(@p_table, 1, 3);
IF(@lv_prefix = 'MAC')
BEGIN
SET @p_prefix = @lv_prefix;
RETURN;
END;
ELSE
SET @p_prefix = 'UNK';
RETURN;
END;
这是我的执行方式:
EXEC SFT.usp_GetPrefix @p_table = 'MAC_CHEESE';
Msg 201,级别16,状态4,过程SFT.usp_GetPrefix,第0行[批处理 [第6行开始]过程或函数'usp_GetPrefix'需要参数 '@p_prefix',未提供。
也尝试过:
EXEC SFT.usp_GetPrefix @p_table = 'MAC_CHEESE', @p_prefix OUTPUT
Msg 137, Level 15, State 2, Line 6
Must declare the scalar variable "@p_prefix".
答案 0 :(得分:1)
您需要传递参数,因为它们都不具有默认值。由于@p_prefix
是一个OUTPUT
参数,为了使用该值,您需要声明一个变量以传递给该参数:
DECLARE @p_prefix varchar(3);
EXEC SFT.usp_GetPrefix @p_table = 'MAC_CHEESE', @p_prefix OUTPUT;
--PRINT @p_prefix; --Or whatever you're going to do with the value.
作为旁注,您可以使您的过程大大缩短:
CREATE PROCEDURE SFT.usp_GetPrefix @p_table VARCHAR(30), @p_prefix VARCHAR(3) OUTPUT AS
BEGIN
SET @p_prefix = CASE LEFT(@p_table,3) WHEN 'MAC' THEN 'MAC' ELSE 'UNK' END;
END