我们如何在SQL SERVER中的动态表中动态添加列?

时间:2014-06-16 21:17:03

标签: sql-server

我的问题几乎无需解释,所以我想以这种方式解释: 我有一张桌子(我们称之为 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”开头所以显然它不会在结果集。

任何形式的帮助都将受到赞赏。

注意:我的问题标题可能不符合我的要求,但我无法获得任何其他标题。

1 个答案:

答案 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+'%'