我有一个存储过程。当我从执行它时,一切正常,我得到了一个结果。但是当我从我的理论中执行它时,我总是得到一个无效的结果,它是否成功并不重要。
CREATE procedure [dbo].[approve_pre_register_demand]
@hashLink varchar(max) AS
BEGIN
DECLARE @bClientId uniqueidentifier;
-- check is token valid and not deactivated
BEGIN
--get uuid by link
SELECT @bClientId = [dbo].[b_client_pre_registration_link].[b_client_uuid]
FROM [dbo].[b_client_pre_registration_link]
WHERE [dbo].[b_client_pre_registration_link].[hash_link] LIKE @hashLink
END
BEGIN
IF NOT EXISTS(SELECT [b_client_uuid] FROM [dbo].[b_client_pre_registration_link] WHERE [hash_link] LIKE @hashLink)
BEGIN
RETURN 'Token does not exists'
END
END
BEGIN
IF NOT EXISTS(SELECT [dbo].[sa_temp_b_client].[uuid] FROM [dbo].[sa_temp_b_client] WHERE [dbo].[sa_temp_b_client].[uuid] LIKE @bClientId)
BEGIN
RETURN 'BClient does not exists'
END
END
BEGIN
IF NOT EXISTS(SELECT [dbo].[at_b_client_files].[b_client_uuid] FROM [dbo].[at_b_client_files] WHERE [dbo].[at_b_client_files].[b_client_uuid] LIKE @bClientId)
BEGIN
RETURN 'BClient files does not exists'
END
END
-- move preregistration to permanent tables
BEGIN
BEGIN
BEGIN TRANSACTION
BEGIN
IF (@@error <> 0)
-- Отменить транзакцию, если есть ошибки
ROLLBACK
END
COMMIT
SELECT 'RESULT' = @hashLink
END
END
END发布于 2020-12-01 06:18:43
在最后一次声明中,您将返回:
SELECT 'RESULT' = @hashLink如果您在或Azure中测试这一点,您将看到上面生成的一行包含一个名为RESULT的列
DECLARE @hashLink varchar(max) = 'test'
SELECT 'RESULT' = @hashLink;

在其他情况下,您有一个RETURN,它将产生一个错误:
CREATE PROCEDURE dbo.TEST
(
@hashLink varchar(max)
)
AS
BEGIN;
RETURN 'text'
END;
GO
EXEC dbo.TEST @hashLink = 'x'如下所示:
Msg 245、级别16、状态1、过程dbo.TEST、第8行批处理开始行14转换在将varchar值“text”转换为数据类型int时失败。
完工时间: 2020-12-01T08:17:03.7036860+02:00
因此,只需将RETURN语句更改为带有alias.的SELECT
此外,如果要使用RETURN获取值,则使用该值的方式如下:
CREATE OR ALTER PROCEDURE dbo.TEST
(
@hashLink varchar(max)
)
AS
BEGIN;
RETURN 5
END;
GO
DECLARE @A INT;
EXEC @A = dbo.TEST @hashLink = 'x'
SELECT @A;https://stackoverflow.com/questions/65085014
复制相似问题