数据库中表id是varchar类型,分三级,每级用两位数代替
id name
01 中国
0101 河南
010101 郑州
比如现在想查询表中二级菜单下最小的id值,然后加1,和数据库中比较,有相同值,那么再加1.如果没有相同的值了,那么就得到这个字符串(id),,,public string getid()
{}这个方法怎么写啊??取最小值加一
id name
01 中国
0101 河南
010101 郑州
比如现在想查询表中二级菜单下最小的id值,然后加1,和数据库中比较,有相同值,那么再加1.如果没有相同的值了,那么就得到这个字符串(id),,,public string getid()
{}这个方法怎么写啊??取最小值加一
select top 1 id as firstid from table where not exist(select id as secondid from table where secondid = firstid + 1) orderby firstid
也就是对每条记录查找id+1的记录是否存在,取id+1不存在的记录中id最小的。
declare @linkID nvarchar(100);
set @ParentID='102'
set @linkID=@ParentID+'%'
select right(('0000'+convert(nvarchar(20),convert(bigint,isNull(max(id),@ParentID+'00'))+1)),len(@ParentID)+2) from Gxh_Area where len(id)=len(@ParentID)+2 and id like @linkID
如果取最大ID是这样
但是你的表每级两位显然是不够用的,建议改成3位
我的是3位的,所以运行是这样
max(AreaCode)取最大
isNull(max(AreaCode),@ParentID+'000')没有情况后面3位是0
最后强补齐位数,再截取右边6位
确实是删除中间的某些,然后想在中间补上。取到最小值加一,如果表里存在,那么在加一。我想在后台写代码,不是sql语句实现。 protected string GetPrivilegeId(string level, string pid)
{
string privilegeId = "";
// 相同父级下,所有的菜单
IDictionary<string, object> _paraDic = new Dictionary<string, object>();
_paraDic.Add("@iPrivilegeId", pid);
_paraDic.Add("@iLevel", level);
DataTable _dt = SelectPrivilege(_paraDic);
ArrayList list = new ArrayList();
if (_dt.Rows.Count > 0)
{
foreach (DataRow dr in _dt.Rows)
{
list.Add(dr[0].ToString());
}
//或取最小值
int min = int.Parse(list[0].ToString());
for (int i = 0; i < list.Count; i++)
{
int temp = int.Parse(list[i].ToString());
if (min > temp)
{
min = temp;
}
}
privilegeId = min.ToString();
}
return privilegeId;
}我是这样写的,现在获取到最小值,不知道该怎么写了
protected string GetPrivilegeId()
{
DataTable dt = new DataTable();//这个是读取数据库当前级别下的所有ID,而且取出来按ID排序
if (dt.Rows.Count >= 99)//两位最大是99
return null;
for (int i = 1; i < dt.Rows.Count; i++)
{
string min = dt.Rows[i - 1]["id"].ToString();
string max = dt.Rows[i]["id"].ToString();
if (Convert.ToDouble(min) + 1 != Convert.ToDouble(max))
{
min = (Convert.ToDouble(min) + 1).ToString().PadLeft(min.Length, '0');
return min;
}
}
return "";
}
如果是写到方法就简单了,不过要一次性读取当前节点下的全部数据(不含子节点)
你为什么要做asp.net呢?
{
DataTable dt = new DataTable();//这个是读取数据库当前级别下的所有ID,而且取出来按ID排序
if (dt.Rows.Count >= 99)//两位最大是99
return null;
if (dt.Rows.Count == 0)
return parentID + "01";
string max = "";
for (int i = 1; i < dt.Rows.Count; i++)
{
string min = dt.Rows[i - 1]["id"].ToString();
max = dt.Rows[i]["id"].ToString();
if (Convert.ToDouble(min) + 1 != Convert.ToDouble(max))
{
min = (Convert.ToDouble(min) + 1).ToString().PadLeft(min.Length, '0');
return min;
}
}
max = (Convert.ToDouble(max) + 1).ToString().PadLeft(max.Length, '0');
return max;
}
where id like '0101__'
and
exists(
select 1 from t
where id=convert
(varchar(20),min(convert(int,id))+1)
)
以上是查询符合条件的一个id值的sql语句,后面就不需要解释了嘛
……貌似没注意看题 不好意思
这个跟linq也木啥关系直接弄字符串来搞基本上等于自虐和虐待机器
直接备份一次数据库 然后给数据库加个数字型排序键值才是正解
就直接把ID转换被数字再存一份好了