我的问题几乎无需解释,所以我想以这种方式解释: 我有一张桌子(我们称之为 RootTable ),它有一百万条记录,而且没有任何正确的顺序。我想要做的是从RootTable获取行数( @ParamCount ),同时必须对这些记录进行排序,并在其上添加一个额外的列(具有唯一数据)飞行以维护行识别的密钥,该密钥将在稍后的程序中使用。它可以采用任意数量的参数,但我的基本参数是下面提到的两个参数。 它是SQL SERVER环境所必需的。
e.g。
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”开头所以显然它不会在结果集。
任何形式的帮助都将受到赞赏。
注意:我的问题标题可能不符合我的要求,但我无法获得任何其他标题。
答案 0 :(得分:1)
首先,你需要你的动态ID。这个是由ROW_NUMBER()
函数创建的,该函数可从SQL Server 2005开始提供。我认为ROW_NUMBER()
将要做的是非常自我解释。但是它只适用于分区。分区由OVER
子句指定。如果在GROUP BY
子句中包含OVER
,则会有多个分区。在您的情况下,只有一个分区是整个表,因此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+'%'
请注意,我在参数后添加了通配符%
,因此条件基本上是&#34;以&#34;开头@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+'%'