Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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 2008中生成分层值的任何方法_Sql_Sql Server 2008 - Fatal编程技术网

在sql server 2008中生成分层值的任何方法

在sql server 2008中生成分层值的任何方法,sql,sql-server-2008,Sql,Sql Server 2008,使用SQL Server,我们需要如下所示的分层数据格式的值 1 1.1 1.1.1 1.1.1.1 1.1.1.2 1.1.1.3 1.1.2 1.1.2.1 1.1.2.2 1.1.2.3 1.1.3 1.1.3.1 1.1.3.2 1.1.3.3 1.1.4 1.1.4.1 1.1.4.2 1.1.4.3 1.2 1.2.1 1.2.1.1 1.2.1.2 1.2.1.3 1.2.2 1.2.2.1 1.2.2.2 1.2.2.3 1.2.3 1.2.3.1 1.2.3.2 1.2.3.3

使用SQL Server,我们需要如下所示的分层数据格式的值

1
1.1
1.1.1
1.1.1.1
1.1.1.2
1.1.1.3
1.1.2
1.1.2.1
1.1.2.2
1.1.2.3
1.1.3
1.1.3.1
1.1.3.2
1.1.3.3
1.1.4
1.1.4.1
1.1.4.2
1.1.4.3
1.2
1.2.1
1.2.1.1
1.2.1.2
1.2.1.3
1.2.2
1.2.2.1
1.2.2.2
1.2.2.3
1.2.3
1.2.3.1
1.2.3.2
1.2.3.3
1.2.4
1.2.4.1
1.2.4.2
1.2.4.3
.
.
1.100.100.100

有人能帮忙吗?

SQL Server 2008引入了表示分层数据的。

SQL Server 2008引入了表示分层数据的。

您没有指定要作为输出的数据类型。我假设您希望字符串按照您在表单1.X.X.X中指定的顺序排列

有几种方法可以实现这一点。紧凑型是将数字0到100交叉连接几次:

;with Numbers (n) as
(
    select 0   -- base case: 0
    union all
    select n + 1 from Numbers where n < 100  -- recursive case: numbers 1 to 100
)
select
    cast (LV1.n as varchar) +
    case LV2.n when 0 then '' else '.' + cast (LV2.n as varchar) end +
    case LV3.n when 0 then '' else '.' + cast (LV3.n as varchar) end +
    case LV4.n when 0 then '' else '.' + cast (LV4.n as varchar) end
from Numbers LV1
    cross join Numbers LV2
    cross join Numbers LV3
    cross join Numbers LV4
where
    LV1.n = 1
    and
    (
              (LV2.n = 0 and LV3.n = 0 and LV4.n = 0)    -- 1.0.0.0 is OK
          or  (LV2.n <> 0 and LV3.n = 0 and LV4.n = 0)   -- 1.X.0.0 is OK
          or  (LV2.n <> 0 and LV3.n <> 0 and LV4.n = 0)  -- 1.X.X.0 is OK
          or  (LV2.n <> 0 and LV3.n <> 0 and LV4.n <> 0) -- 1.X.X.X is OK
    )
order by LV1.n, LV2.n, LV3.n, LV4.n
本例使用递归公共表表达式CTE生成数字0到100。然后,代码将这些数字交叉连接4次,形成一个X.X.X.X的模式

where子句将输出限制为第一个数字为1且零值后没有非零值的所有情况

select将零值转换为空值。所以1.0.0.0被转换成1,1.1.0.0被转换成1.1,等等


在我的开发机器上运行SQL Server 2008 R2 Developer Edition SSMS查询窗口时,它将在3秒内开始返回数据。它在大约15秒钟内返回100万条记录。

您没有指定要作为输出的数据类型。我假设您希望字符串按照您在表单1.X.X.X中指定的顺序排列

有几种方法可以实现这一点。紧凑型是将数字0到100交叉连接几次:

;with Numbers (n) as
(
    select 0   -- base case: 0
    union all
    select n + 1 from Numbers where n < 100  -- recursive case: numbers 1 to 100
)
select
    cast (LV1.n as varchar) +
    case LV2.n when 0 then '' else '.' + cast (LV2.n as varchar) end +
    case LV3.n when 0 then '' else '.' + cast (LV3.n as varchar) end +
    case LV4.n when 0 then '' else '.' + cast (LV4.n as varchar) end
from Numbers LV1
    cross join Numbers LV2
    cross join Numbers LV3
    cross join Numbers LV4
where
    LV1.n = 1
    and
    (
              (LV2.n = 0 and LV3.n = 0 and LV4.n = 0)    -- 1.0.0.0 is OK
          or  (LV2.n <> 0 and LV3.n = 0 and LV4.n = 0)   -- 1.X.0.0 is OK
          or  (LV2.n <> 0 and LV3.n <> 0 and LV4.n = 0)  -- 1.X.X.0 is OK
          or  (LV2.n <> 0 and LV3.n <> 0 and LV4.n <> 0) -- 1.X.X.X is OK
    )
order by LV1.n, LV2.n, LV3.n, LV4.n
本例使用递归公共表表达式CTE生成数字0到100。然后,代码将这些数字交叉连接4次,形成一个X.X.X.X的模式

where子句将输出限制为第一个数字为1且零值后没有非零值的所有情况

select将零值转换为空值。所以1.0.0.0被转换成1,1.1.0.0被转换成1.1,等等


在我的开发机器上运行SQL Server 2008 R2 Developer Edition SSMS查询窗口时,它将在3秒内开始返回数据。它在大约15秒内完成了100万条记录的返回。

查看递归CTE。您想做什么?您是否有要编号的行?您是否试图按需生成一组标题?输出是什么?是字符串列表,还是每个数字都可以是单独的列?查看递归CTE。您试图做什么?您是否有要编号的行?您是否正在尝试按需生成一组标题?输出结果是什么?是字符串列表,还是每个数字都可以是单独的列?这是一段很棒的代码。很棒,但由于您指定了LV1.n=1,您只返回了约100万行,而不是100万行:-谢谢。我在回答中注意到了这一点。如果只有SMMS查询结果窗口中返回的行单元格有数字分组!这是一段非常棒的代码。非常棒,但是由于您指定了LV1.n=1,您只返回了约1M行,而不是100M行:-谢谢。我在回答中注意到了这一点。如果只有SMMS查询结果窗口中返回的行单元格有数字分组!