Tsql 更新/设置/输出/从,输出为变量

Tsql 更新/设置/输出/从,输出为变量,tsql,sql-server-2012,Tsql,Sql Server 2012,考虑以下存储过程 CREATE PROCEDURE AssignCodeToCustomer (@customerId int) AS BEGIN DECLARE @code NVARCHAR(255) BEGIN TRY BEGIN TRANSACTION SELECT @code = ( UPDATE Codes SET Cust

考虑以下存储过程

CREATE PROCEDURE AssignCodeToCustomer (@customerId int)
AS
BEGIN
    DECLARE @code NVARCHAR(255)

    BEGIN TRY
        BEGIN TRANSACTION

        SELECT @code = (
            UPDATE
                Codes
            SET
                CustomerId = @customerId
            OUTPUT
                INSERTED.Code
            FROM (
                SELECT TOP 1
                    Code
                FROM
                    Codes
            ) AS c
            WHERE
                c.Code = Codes.Code

        -- Other stuff

        COMMIT TRANSACTION
    END TRY

    BEGIN CATCH
        BEGIN
            ROLLBACK TRANSACTION

            EXEC spLogSQLError
        END
    END CATCH
END
GO

我在第10行(包含关键字
UPDATE
)的关键字
UPDATE附近发现一个错误“语法不正确”。我也可以先选择一个代码,然后分配它,但考虑到并发性,我只需要一个查询。如果我不尝试将输出值设置到变量中,查询就会工作。如何修复此错误或使用其他方法?

您无法将
OUTPUT
中的值捕获到标量变量中,原因很明显,
OUTPUT
可以生成多个列和行,标量变量只包含一个值。如果要捕获记录输出,则需要在表变量中执行此操作。但由于
TOP 1
最多保证一行,您可以直接在
UPDATE
中分配给变量,而无需任何嵌套
UPDATE TOP(1)Codes SET CustomerId=@CustomerId,@code=Codes FROM Codes
假设您只需要一个任意的
TOP
-如果您想要一个
订单,您可能需要一个子查询applied@Larnu但是它不能用OP尝试过的方式来分配变量。哈,这是一些古怪的语法,@GarethD,但你是对的。@MartinSmith,我不需要任何排序,所以你的建议对我有用。非常感谢。如果您添加一个答案,我可以将其标记为我的问题的已接受答案。