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

Sql server 如何在SQL SERVER的动态表中动态添加列?,sql-server,Sql Server,我的问题不需要什么解释,所以我想这样解释: 我有一个表(我们称之为RootTable),它有一百万条记录,而且顺序不正确。我试图做的是从RootTable中获取行数(@ParamCount),同时这些记录必须进行排序,并动态添加一个额外的列(带有唯一数据),以维护一个用于行标识的键,该键稍后将在程序中使用。它可以接受任意数量的参数,但我的基本参数是下面提到的两个。 SQL SERVER环境需要它 e、 g 传递要返回@ParamCount和columnA startswith的行数 @param

我的问题不需要什么解释,所以我想这样解释: 我有一个表(我们称之为RootTable),它有一百万条记录,而且顺序不正确。我试图做的是从RootTable中获取行数(@ParamCount),同时这些记录必须进行排序,并动态添加一个额外的列(带有唯一数据),以维护一个用于行标识的键,该键稍后将在程序中使用。它可以接受任意数量的参数,但我的基本参数是下面提到的两个。 SQL SERVER环境需要它

e、 g

传递要返回@ParamCount和columnA startswith的行数 @paramNameStartsWith

关于Id列还有一点。Id必须保持其顺序,就像上面的结果一样,它从101开始,因为在排序和动态添加列时,100已经分配给第一行,并且因为它以“ABC”开始,所以显然它不在结果集中

任何形式的帮助都将不胜感激


注意:我的问题标题可能没有反映我的要求,但我无法获得任何其他标题。

因此,首先您需要即时ID。此ID由SQL Server 2005以后提供的
行编号()函数创建。我认为,
ROW\u NUMBER()
所能做的就是自我解释。但是,它只在分区上工作。分区由
OVER
子句指定。如果在
OVER
子句中包含
groupby
,则将有多个分区。在您的情况下,只有一个分区是整个表,因此不需要
groupby
。但是,需要一个
ORDER BY,以便系统知道哪个记录应该获得分区中的哪个行号。您得到的查询是:

SELECT ROW_NUMBER() OVER (ORDER BY ColumnA) ID, ColumnA,ColumnB,ColumnC
FROM RootTable
现在您有了整个表的行号。您不能在此处包含任何条件,如带有参数的
@paramnamestswith,因为您需要为整个表设置行号。上面的查询必须是一个子查询,提供可应用条件的集合。我在这里使用CTE,我认为这对可读性更好:

;WITH OrderedList AS (
    SELECT ROW_NUMBER() OVER (ORDER BY ColumnA) ID, ColumnA,ColumnB,ColumnC
    FROM RootTable
)
SELECT *
FROM OrderedList
WHERE ColumnA LIKE @ParamNameStartsWith+'%'
请注意,我在参数后面添加了通配符
%
,因此条件基本上是“以”@paramnestartswith开头”

最后,如果我答对了,您只需要
@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+'%'

这有点令人困惑。所以
rootstable
是一个临时表/表类型变量吗?@Rahul:不,它是我数据库中的一个表。如果我是你,如果我完全理解你想要的,我会查看行数功能。为什么ZZC在结果集中,而不是BCC?更重要的是,为什么ZZC的B栏是“城市”,而在您原来的表格中它是“城市1”?第三个问题:你说这个表没有特定的顺序,但是有一个额外的列,你想保持顺序。您将如何维护一个不存在的订单?您使用的是哪个版本?对于sql 2008及以上版本,您可以使用HLGEM提到的行数。否则,我建议你考虑另一种方法,比如添加一个身份栏,因为如果你的表真的有MILIN记录,那将是你的应用程序的噩梦,你是天才。非常感谢你。它解决了我95%的问题,但我在执行这个查询后遇到了一个小问题。我不明白为什么前几张唱片的顺序不正确,因为我在这里截取了视频;不确定我是否看到了正确的结果,但我认为第4行到第14行以空白开头。如果我是对的,那么排序是正确的,首先是空白,然后是“1”,然后是“A”
SELECT ROW_NUMBER() OVER (ORDER BY ColumnA) ID, ColumnA,ColumnB,ColumnC
FROM RootTable
;WITH OrderedList AS (
    SELECT ROW_NUMBER() OVER (ORDER BY ColumnA) ID, ColumnA,ColumnB,ColumnC
    FROM RootTable
)
SELECT *
FROM OrderedList
WHERE ColumnA LIKE @ParamNameStartsWith+'%'
;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+'%'