如何用范围标识编写更新过程

时间:2016-03-22 10:42:29

标签: sql-server

我的插入程序正常工作,我想要的方式。但更新不适用于范围标识。

SET ANSI_NULLS ON

ALTER PROCEDURE [dbo].[spr_unitCreation]
(
    @Unit_Name VARCHAR(50) = NULL,
    @Unit_Abbreviation VARCHAR(50) = NULL,
    @Unit_type VARCHAR(50) = NULL,
    @Decimal_Places VARCHAR(50) = NULL,
    @Description VARCHAR(50) = NULL,
    @Super_Unit VARCHAR(50) = NULL,
    @Per_Unit VARCHAR(50) = NULL,
    @unit_Id INT OUTPUT,
    @abc VARCHAR(50) = NULL
)
AS
BEGIN
    IF @abc = 'update' BEGIN

        SET NOCOUNT ON;

        SELECT @unit_Id AS SCOPE_IDENTITY

        UPDATE tbl_UnitCreation
        SET Unit_Name = @Unit_Name,
            Unit_Abbreviation = @Unit_Abbreviation,
            Unit_type = @Unit_type,
            Decimal_Places = @Decimal_Places,
            Description = @Description,
            Super_Unit = @Super_Unit,
            Per_Unit = @Per_Unit
        WHERE unit_Id = @unit_Id
    END

END

SELECT * FROM tbl_UnitCreation

2 个答案:

答案 0 :(得分:0)

SCOPE_IDENTITY返回插入标识列的最后一个标识值。你没有插入一行。

要更新行,您只需要在执行[spr_unitCreation]时将值传递给@unit_Id。同时删除行" SELECT @unit_Id AS SCOPE_IDENTITY"来自你的代码。

根据评论,您需要通过搜索相关详细信息找到正确的ID。所以你可以得到这样的id:

SELECT @unit_Id = unit_Id
FROM tbl_UnitCreation
WHERE Unit_Name=@Unit_Name -- NB: Ensure this column contains your relevant details

答案 1 :(得分:0)

另一个常用选项是使用UPDATE语句的OUTPUT子句,将所有更新的/“插入的”主键和Unit_name插入到表变量中。

https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-2017