2011-09-18 80 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