【问题标题】:TSQL Incrementing Count of VariableSQL递增变量计数
【发布时间】:2016-06-20 22:49:32
【问题描述】:

我有一个 UI,它允许用户选择他们想要添加到表中的一个或多个字段。该数据还有一个与之关联的orderID,用于确定字段顺序。

当用户添加新字段时,我需要找到该用户最后使用的orderID并将其加1,提交所有新字段。

例如,如果数据库中已经存在一条记录,则它的orderID 为 1。当我选择再添加三个字段时,它会检查我使用的最后一个 orderID (1) 然后为它添加的每个新记录递增 1-4。

-- Get the last ID orderID for this user and increment it by 1 as our starting point
DECLARE @lastID INT = (SELECT TOP 1 orderID FROM dbo.BS_ContentRequests_Tasks_User_Fields WHERE QID = @QID ORDER BY orderID DESC)
SET @lastID = @lastID+1;

-- Create a temp table to hold our fields that we are adding
DECLARE @temp AS TABLE (fieldID int, orderID int)

-- Insert our fields and incremented numbers
INSERT INTO @temp( fieldID, orderID )
SELECT ParamValues.x1.value('selected[1]', 'int'),
       @lastID++
FROM   @xml.nodes('/root/data/fields/field') AS ParamValues(x1);

显然@lastID++ 部分是我的问题所在,但希望它有助于理解我想要做什么。

还有什么方法可以解决这个问题?

【问题讨论】:

    标签: sql-server tsql stored-procedures sql-server-2012


    【解决方案1】:

    ROW_NUMBER() 应该这样做。

    select  x.Value,
            ROW_NUMBER() over (order by x.Value) + @lastID
        from (
            select 10 ParamValues.x1.value('selected[1]', 'int') Value
                from @xml.nodes('/root/data/fields/field') AS ParamValues(x1)
            ) x
    

    【讨论】:

    • 我收到了这个错误 - Msg 5308, Level 16, State 1, Procedure BS_Update_ContentRequests_AvailableFields, Line 43 Windowed functions and NEXT VALUE FOR functions do not support integer indices as ORDER BY clause expressions.
    • 嗯。我将其更新为在 order by 子句中使用值本身......不认为这是必要的,但我想是的。
    【解决方案2】:

    您可以使用 IDENTITY(1,1) 列

    【讨论】:

      【解决方案3】:

      如果您希望 OrderID 在整个表格中是唯一的,请参见下文:

      点击here查看另一篇解决此问题的帖子。

      有多种方法可以解决此问题,但在这种情况下,最简单但合理的方法可能是使用标识列。但是,这不像使用序列那样可扩展。如果您觉得将来可能需要更大的灵活性,请使用序列。

      如果您希望 OrderID 在一批插入的字段中是唯一的,请参见下文:

      你应该仔细看看 Chris Steele 的回答。

      【讨论】:

        猜你喜欢
        • 2019-04-05
        • 2023-02-19
        • 2013-05-27
        • 2013-04-14
        • 2017-06-27
        • 2016-10-29
        • 1970-01-01
        • 2021-07-21
        • 1970-01-01
        相关资源
        最近更新 更多