2011-09-18 76 views
0

位置我有一个SP,更新一些行,我想更新SortOrder的专栏中,我有它在选择位置 - 这里是我的代码部分:更新选择并保存在选择的结果SortOrder的

UPDATE StagingCategoryItems 
    SET IsDeleted = 0, 
    ModifiedOn = GETDATE(), 
    ModifiedBy = 'DragDropSP' 
    WHERE ItemID IN (
    SELECT ItemID 
    FROM StagingCategoryItems 
     WHERE [email protected] 
     AND [email protected] 
    AND ItemID IN 
    (
    SELECT items 
       FROM dbo.Split(@InIds,',') 
     ) 
    AND IsDeleted=1 
    ) 
    AND [email protected] AND [email protected] 

所以我想添加一个:

SortOrder = POSITION_IN_SELECT_RESULT 

我将如何做到这一点?

+0

按照什么顺序排列?是否有列表示顺序的列?或者你是否认为'@ InIds'中的顺序?什么版本的SQL Server? –

回答

2

如果您在讨论@InIds中的输入顺序,它可能需要更改函数以在输出中包含排名。假设一个数字表:

SET NOCOUNT ON; 
DECLARE @UpperLimit INT; 
SET @UpperLimit = 200000; 

;WITH n AS 
(
    SELECT rn = ROW_NUMBER() OVER (ORDER BY s1.[object_id]) 
    FROM sys.objects AS s1 
    CROSS JOIN sys.objects AS s2 
    CROSS JOIN sys.objects AS s3 
) 
SELECT [Number] = rn - 1 INTO dbo.Numbers 
FROM n WHERE rn <= @UpperLimit + 1; 

CREATE UNIQUE CLUSTERED INDEX n ON dbo.Numbers([Number]); 

您可以创建这样一个功能:

CREATE FUNCTION dbo.Split 
(
    @List  VARCHAR(MAX), 
    @Delimiter VARCHAR(10) 
) 
RETURNS TABLE 
AS 
    RETURN 
    (
     SELECT 
      [Position] = ROW_NUMBER() OVER (ORDER BY [Number]), 
      [Value] = CONVERT(INT, 
       SUBSTRING(@List, [Number], 
       CHARINDEX 
       (
        @Delimiter, @List + @Delimiter, [Number] 
       ) - [Number])) 
     FROM dbo.Numbers 
     WHERE Number <= LEN(@List) 
      AND SUBSTRING 
      (
       @Delimiter + @List, [Number], LEN(@Delimiter) 
      ) = @Delimiter 
    ); 
GO 

所以,现在你UPDATE可能是这个样子:

UPDATE i SET 
    [Order] = f.[Position], 
    IsDeleted = 0, 
    ModifiedOn = GETDATE(), 
    ModifiedBy = 'DragDropSP' 
FROM dbo.StagingCategoryItems AS i 
INNER JOIN dbo.Split(@InIds, ',') AS f 
ON i.ItemID = f.[Value] 
WHERE IsDeleted = 1 
AND ManufacturerID = @ManufacturerID 
AND CategoryID  = @CategoryID; 

(我也删除您的冗余检查对同一张桌子。)

+0

像一个魅力工作,只是改变你从INT转换为VARCHAR - 谢谢! – Slee