[英]How we can add column in sql server with auto generated record insertion number. if Index are defined on that table
[英]How can we add a column on the fly in a dynamic table in SQL SERVER?
我的问题几乎不需要解释,所以我想用这种方式来解释:我有一个表(叫它RootTable ),它有一百万条记录,而且顺序不正确。 我想做的是从RootTable中获取行数( @ParamCount ),同时必须对这些记录进行排序,并且还要动态添加一个附加列(具有唯一数据)以维护行键标识,该标识将在以后的程序中使用。 它可以接受任意数量的参数,但是我的基本参数是下面提到的两个。 SQL SERVER环境需要它。
例如
RootTable
ColumnA ColumnB ColumnC
ABC city cellnumber
ZZC city1 cellnumber
BCD city2 cellnumber
BCC city3 cellnumber
传递行数以返回@ParamCount和columnA以@paramNameStartsWith 开头
<b>@paramCount:2 <br>
@ParamNameStartsWith:BC</b>
预期结果:
Id(added on the fly) ColumnA ColumnB ColumnC
101 BCC city3 cellnumber
102 BCD city2 cellnumber
这是有关Id列的另一点。 ID必须保持其顺序,就像上面的结果一样,它从101开始,因为在进行排序和添加列时已经将100分配给了第一行,并且因为它以“ ABC”开头,所以显然不会出现在结果集。
任何帮助将不胜感激。
注意:我的问题标题可能无法反映我的要求,但是我无法获得任何其他标题。
因此,首先您需要即时ID。 这是由ROW_NUMBER()
函数创建的,该函数可从SQL Server 2005开始使用。 我认为ROW_NUMBER()
作用是不言自明的。 但是,它仅适用于分区。 分区由OVER
子句指定。 如果在OVER
子句中包含GROUP BY
,则将有多个分区。 在您的情况下,整个表只有一个分区,因此不需要GROUP BY
。 但是,需要ORDER BY
,以便系统知道哪个记录应该获取分区中的哪个行号。 您得到的查询是:
SELECT ROW_NUMBER() OVER (ORDER BY ColumnA) ID, ColumnA,ColumnB,ColumnC
FROM RootTable
现在您有了整个表的行号。 您不能在此处包括@ParamNameStartsWith
参数之类的任何条件,因为您希望为整个表设置行号。 上面的查询必须是一个子查询,该子查询提供了可以应用条件的集合。 我在这里使用CTE,我认为这样对可读性更好:
;WITH OrderedList AS (
SELECT ROW_NUMBER() OVER (ORDER BY ColumnA) ID, ColumnA,ColumnB,ColumnC
FROM RootTable
)
SELECT *
FROM OrderedList
WHERE ColumnA LIKE @ParamNameStartsWith+'%'
请注意,我在参数后添加了通配符%
,因此该条件基本上是“以...开头” @ParamNameStartsWith。
最后,如果我说对了,您只需要@ParamCount
行。 您可以将参数直接与TOP关键字一起使用,这仅在SQL Server 2005或更高版本中才可以使用。
;WITH OrderedList AS (
SELECT ROW_NUMBER() OVER (ORDER BY ColumnA) ID, ColumnA,ColumnB,ColumnC
FROM RootTable
)
SELECT TOP (@ParamCount) *
FROM OrderedList
WHERE ColumnA LIKE @ParamNameStartsWith+'%'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.