Sql 返回一个更新存储过程

Sql 返回一个更新存储过程,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我的SQL SERVER 2008上有以下存储过程: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[SAVE1] @IDKEY float, @CPF nvarchar(20) AS BEGIN SET NOCOUNT ON; BEGIN TRY UPDATE people SET NINUMBER = @CPF WHERE IDKEY = (SELECT IDKEY

我的SQL SERVER 2008上有以下存储过程:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SAVE1]
    @IDKEY float,
    @CPF nvarchar(20)
AS
BEGIN
    SET NOCOUNT ON;
BEGIN TRY
    UPDATE people SET NINUMBER = @CPF WHERE IDKEY = (SELECT IDKEY from contact where IDKEY= @IDKEY)
    SELECT 1 as retorno
END TRY
BEGIN CATCH
    SELECT 0 as retorno
END CATCH


END

但是如果我使用无效的IDKEY执行,则返回值为1,但我认为会输入CATCH并返回0。我做错了什么?

在这种情况下不会抛出异常。您的子查询将不返回任何记录,因此update语句将针对零记录执行。但是它不会失败。

您的查询没有失败,而是没有返回行,因此返回1。试着这样做:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SAVE1]
    @IDKEY float,
    @CPF nvarchar(20)
AS

BEGIN
    SET NOCOUNT ON;

    UPDATE people SET NINUMBER = @CPF WHERE IDKEY = (SELECT IDKEY from contact where IDKEY= @IDKEY)
END

IF (@@ROWCOUNT > 0)
BEGIN
     SELECT 1 as retorno
END
ELSE 
BEGIN
    SELECT 0 as retorno
END

注意:只有当发生错误或异常时,catch块中的代码才会运行,为什么您不只是执行UPDATE people SET NINUMBER=@CPF WHERE IDKEY=@IDKEY?我的错误是,示例中的代码应该不同。更新人员设置NINUMBER=@CPF,其中IDKEY=从联系人中选择IDKEY,其中CDKEY=@CDKEYYou将浮点用作主键???是的,我将浮点用作主键。怎么了?很有魅力。我会把它用于其他程序。非常感谢。