Sql server SQL选择数字-每行动态递增
有没有一种方法可以编写一个动态sql select语句,而不是查询返回如下内容的表/列Sql server SQL选择数字-每行动态递增,sql-server,select,auto-increment,numeric,Sql Server,Select,Auto Increment,Numeric,有没有一种方法可以编写一个动态sql select语句,而不是查询返回如下内容的表/列 id 1 2 3 4 5 ... etc. 我需要编写几个从1到X的通用查询 X将由不同的查询预先确定 假设X为5,则数据将返回5行,其中包含1 2 3 4 5 如果X为27,数据将返回1 2 3。。。27等等 在附加注释中,这是在第三方sybase软件中使用的,我仅限于查询的复杂性,创建和删除表似乎不起作用确保可以使用理货表 或者你需要的只是排号 您可以尝试这样的递归CTE declare @mx i
id
1
2
3
4
5
...
etc.
我需要编写几个从1到X的通用查询
X将由不同的查询预先确定
假设X为5,则数据将返回5行,其中包含1 2 3 4 5
如果X为27,数据将返回1 2 3。。。27等等
在附加注释中,这是在第三方sybase软件中使用的,我仅限于查询的复杂性,创建和删除表似乎不起作用确保可以使用理货表
或者你需要的只是排号 您可以尝试这样的递归CTE
declare @mx integer=4
;with test as (
select 1 as id
union all
select id+1
from test
where id<@mx
)
select * from test
27选择:
DECLARE @Count int = 1
DECLARE @MaxCount int = 27 -- Whatever your incoming max is
WHILE @Count <= @MaxCount
BEGIN
SELECT @Count
SELECT @Count = @Count + 1
END
一个选择:
CREATE TABLE #TEMPNUMS (AUTONUM INT IDENTITY (1,1), GHOSTVAL VARCHAR(1))
DECLARE @Count int = 1
DECLARE @MaxCount int = 27 -- Whatever your incoming max is
WHILE @Count <= @MaxCount
BEGIN
INSERT INTO #TEMPNUMS (GHOSTVAL)
SELECT ''
SELECT @Count = @Count + 1
END
SELECT AUTONUM FROM #TEMPNUMS
DROP TABLE #TEMPNUMS
你试过这样使用CTE吗
WITH OrderedRows (ROWN)
AS (
SELECT 1 AS ROWN
UNION ALL
SELECT r.ROWN + 1 AS ROWN
FROM OrderedRows r
WHERE r.ROWN < 100
)
SELECT *
FROM OrderedRows
假设你的最大值永远不会超过9999。如果是,则需要重新构造查询以添加另一层
DECLARE @MaxCount int = 27 -- Whatever your incoming max is
SELECT ones.n + 10*tens.n + 100*hundreds.n + 1000*thousands.n
FROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) ones(n),
(VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) tens(n),
(VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) hundreds(n),
(VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) thousands(n)
where ones.n + 10*tens.n + 100*hundreds.n + 1000*thousands.n between 1 and @MaxCount
ORDER BY 1
请参阅另一个类似问题的答案:我不知道您想要27个单选还是27行的单选。两个答案都包括在内。1选择27行。更新答案1选择。这将在第三方应用程序中,我必须确认是否支持临时表的复杂性。您仍应投票支持回答原始问题的答案,即使你发现新的信息使它们无效:我不能使用这么复杂的东西数据将被第三方sybse软件处理,我可以处理基本的简单查询,这是很困难的。尽管谢谢你的提示,我了解到新的理货表并不复杂。这是迄今为止最干净、最简单的解决方案。创建一个从0到的数字表,然后使用联接。例如,0..86399为一天中的每一秒提供一个条目。或者,0..1023给出了一个表,您可以反复对其自身进行连接,以获得有用且任意大范围的值。。。从dbo.numbers中选择*,其中id介于1和27之间是最简单的…可能希望包含MAXRECURSION0,以防止遇到超过100的奇怪行为。然后解释当达到32k及以上时存在的成本/问题……另外,最好从两个值0和1开始,然后开始加入表本身,每个递归级别将使用的范围扩大一倍,提供更高的范围和更好的缩放。这里一定要小心…用于计数的cte基本上是一个循环。为了避免重复您自己的操作,您可以使用类似于“从值0,1,2,3,4,5,6,7,8,9选择十个一交叉连接十个十交叉连接十个一百交叉连接十个百个blahblahblah…”的值来选择*从值0,1,2,3,4,5,6,7,8,9一从十个一交叉连接十个十交叉连接十个百个blahblahblahblah…可能希望包括MAXRECURSION0,以防止在100以上遇到奇怪。然后解释当你达到32k及以上时存在的成本/问题…这里一定要小心…用于计数的cte基本上是一个循环。在评论中,您提到了第三方sybase软件和临时表的复杂性;您可能需要更新您的问题,并提供有关您的环境的其他详细信息,例如,您是否正在编写将在远程Sybase ASE数据库上运行的SQL Server T-SQL代码等,以包括各种产品名称和版本;我们掌握的细节越多越好。。。否则,我们可能会浪费时间发布在您的环境中不可接受/不可行的答案。我还建议您提供一个更详细的示例,说明您计划如何使用这些数字;按照目前的措辞,我不知道您是否想使用这些数字进行插入、删除、更新和选择。。。如果您想将其用于加入/SARG目的。。。如果是select,为什么不能从id介于1和X之间的表格中选择*这个问题向我表明,SArg将不会是Op认可的术语。还有一个问题。。。X的最大值是多少?