繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM