需求:任意具排序欄位的表單實現上移/下移,支援分類分組排序。網路搜尋無理想結果,自行實作分享。
ALTER PROCEDURE [dbo].[Proc_Common_UpDown]
@Sign int = 0, -- 0:上移 1:下移
@TableName nvarchar(50), -- 表名
@ItemName nvarchar(50), -- 主鍵欄位名
@ItemID int, -- 主鍵值
@SortName nvarchar(50), -- 排序欄位名
@TypeName nvarchar(50)='', -- 分類欄位名
@TypeValue nvarchar(50)='' -- 分類值
AS
BEGIN
SET NOCOUNT ON
DECLARE @SQL nvarchar(4000), @ThisSort int, @PREVID int, @NextID int, @Count int
-- 建立暫時索引表
CREATE TABLE #Tab (ItemID int, Sort int)
SET @SQL = 'INSERT INTO #Tab (ItemID,Sort) SELECT ' + @ItemName + ',' + @SortName + ' FROM ' + @TableName
IF (@TypeName<>'' AND @TypeValue<>'') SET @SQL = @SQL + ' WHERE ' + @TypeName + '=' + @TypeValue
SET @SQL = @SQL + ' ORDER BY Sort ASC'
EXEC(@SQL)
SET @SQL = ''
SELECT @Count = COUNT(*) FROM #Tab
SELECT @ThisSort = Sort FROM #Tab WHERE ItemID = @ItemID
IF(@ThisSort>1) SELECT @PREVID = ItemID FROM #Tab WHERE Sort=(@ThisSort-1)
IF(@ThisSort<@Count) SELECT @NextID = ItemID FROM #Tab WHERE Sort=(@ThisSort+1)
IF(@Sign=0) BEGIN -- 上移
IF(@ThisSort>1) BEGIN
SET @SQL = 'UPDATE ' + @TableName + ' SET ' + @SortName + '=' + CONVERT(varchar(100),(@ThisSort-1)) + ' WHERE ' + @ItemName + ' = ' + CONVERT(varchar(100),@ItemID) + ';'
+ 'UPDATE ' + @TableName + ' SET ' + @SortName + '=' + CONVERT(varchar(100),@ThisSort) + ' WHERE ' + @ItemName + ' = ' + CONVERT(varchar(100),@PREVID)
END
END ELSE BEGIN -- 下移
IF(@ThisSort<@Count) BEGIN
SET @SQL = 'UPDATE ' + @TableName + ' SET ' + @SortName + '=' + CONVERT(varchar(100),(@ThisSort+1)) + ' WHERE ' + @ItemName + ' = ' + CONVERT(varchar(100),@ItemID) + ';'
+ 'UPDATE ' + @TableName + ' SET ' + @SortName + '=' + CONVERT(varchar(100),@ThisSort) + ' WHERE ' + @ItemName + ' = ' + CONVERT(varchar(100),@NextID)
END
END
EXEC(@SQL)
END
public class Common {
public static Database db = DatabaseFactory.CreateDatabase("Huoqk_CMS");
public static void UPDown(int Sign, string TableName, string ItemName, int ItemID, string SortName, string TypeName, string TypeValue) {
string spName = "Proc_Common_UpDown";
DbCommand dbCommand = db.GetStoredProcCommand(spName);
db.AddInParameter(dbCommand, "Sign", DbType.Int32, Sign);
db.AddInParameter(dbCommand, "TableName", DbType.String, TableName);
db.AddInParameter(dbCommand, "ItemName", DbType.String, ItemName);
db.AddInParameter(dbCommand, "ItemID", DbType.Int32, ItemID);
db.AddInParameter(dbCommand, "SortName", DbType.String, SortName);
db.AddInParameter(dbCommand, "TypeName", DbType.String, TypeName);
db.AddInParameter(dbCommand, "TypeValue", DbType.String, TypeValue);
db.ExecuteNonQuery(dbCommand);
}
}
public void UPDown(int sign, int itemid) {
Common.UPDown(sign, "CMS_Channel", "CID", itemid, "Sort", "", "");
}
// 上移
UPDown(111, 0);
// 下移
UPDown(111, 1);
雖然程式碼略顯囉嗦 (深夜趕工),但功能完整、通用性強,可直接套用於任何需排序上移下移的業務場景。