Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL选择数字-每行动态递增_Sql Server_Select_Auto Increment_Numeric - Fatal编程技术网

Sql server SQL选择数字-每行动态递增

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

有没有一种方法可以编写一个动态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 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的最大值是多少?