Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.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 Server_While Loop - Fatal编程技术网

Sql server 使用枚举数据初始化表

Sql server 使用枚举数据初始化表,sql-server,while-loop,Sql Server,While Loop,我想用枚举数据初始化一个表,如 | x | y | z | domain | |---|---|---|--------| | 1 | 1 | 1 | a.com | | 1 | 2 | 1 | a.com | | 1 | 3 | 1 | a.com | 通过运行以下存储过程: exec init_table 10, 10, 1 有些桌子看起来像 | i | domain | |---|--------| | 1 | a.com | | 2 | b.com | 我有以下几

我想用枚举数据初始化一个表,如

| x | y | z | domain | 
|---|---|---|--------|
| 1 | 1 | 1 | a.com  | 
| 1 | 2 | 1 | a.com  | 
| 1 | 3 | 1 | a.com  |
通过运行以下存储过程:

exec init_table 10, 10, 1
有些桌子看起来像

| i | domain | 
|---|--------|
| 1 | a.com  |
| 2 | b.com  |
我有以下几点

-- Set z to default if `null` is passed in
if (@num_coordinate_z is null) begin set @num_coordinate_z = 1 end

-- Initialize counters for loop
declare @x int = 1, @y int = 1, @z int = 1, @d int = 1
declare @num_domains int = (select distinct count(domain) from 
someDb..someTable)

while (@x <= @num_coordinate_x) begin
  while (@y <= @num_coordinate_y) begin
    while (@z <= @num_coordinate_z) begin
      while (@d <= @num_domains)      begin

        insert into configMotorsTest (
          coordinate_x,
          coordinate_y,
          coordinate_z,
          domain
        ) values (
          @x,
          @y,
          @z,
          (select [domain] from someDb..someTable where [i] = @d)
        )

        set @d = @d + 1

      end 
      set @x = @x + 1
     end
     set @y = @y + 1
   end
   set @z = @z + 1
 end
但它只写了一张唱片


如何使用存储过程exec初始化10、10、1、2 x、y、z域表?

这更适合于计数。到目前为止,WHILE循环是最糟糕的方法。太慢了

假设您有一个域地址表,那么您可以简单地执行以下操作:

WITH Tally AS(
    SELECT N
    FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10))N(N))
SELECT N1.N AS x,
       N2.N AS y,
       N3.N AS z,
       D.Domain
FROM dbo.DomainTable D
     CROSS JOIN N N1
     CROSS JOIN N N2
     CROSS JOIN N N3;
这将为每个电子邮件地址创建1000个10*10*10行,其中x、y和z的变化幅度最大

对于更动态的方法:

DECLARE @x int = 10,
        @y int = 10,
        @z int = 1;

DECLARE @m int = (SELECT MAX(V.N) FROM (VALUES(@x),(@y),(@z))V(N));

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
    SELECT TOP (@m)
           ROW_NUMBER () OVER (ORDER BY (SELECT NULL)) AS I
    FROM N N1, N N2, N N3, N N4) --this'll create 10,000 rows
SELECT T1.I AS x,
       T2.I AS y,
       T3.I AS z,
       D.Domain
FROM dbo.DomainTable D
     CROSS JOIN Tally T1
     CROSS JOIN Tally T2
     CROSS JOIN Tally T3
WHERE T1.I <= @x
  AND T2.I <= @y
  AND T3.I <= @z;
如果@x、@y和@z的值为1000,那么这将创建1000^3 100000000行,并且它接受的值最多为10000


然而,我一秒钟也不建议您真的尝试一次创建超过100万行;这只会填充您的事务日志,可能会导致失败。

这更适合于计数。到目前为止,WHILE循环是最糟糕的方法。太慢了

假设您有一个域地址表,那么您可以简单地执行以下操作:

WITH Tally AS(
    SELECT N
    FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10))N(N))
SELECT N1.N AS x,
       N2.N AS y,
       N3.N AS z,
       D.Domain
FROM dbo.DomainTable D
     CROSS JOIN N N1
     CROSS JOIN N N2
     CROSS JOIN N N3;
这将为每个电子邮件地址创建1000个10*10*10行,其中x、y和z的变化幅度最大

对于更动态的方法:

DECLARE @x int = 10,
        @y int = 10,
        @z int = 1;

DECLARE @m int = (SELECT MAX(V.N) FROM (VALUES(@x),(@y),(@z))V(N));

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
    SELECT TOP (@m)
           ROW_NUMBER () OVER (ORDER BY (SELECT NULL)) AS I
    FROM N N1, N N2, N N3, N N4) --this'll create 10,000 rows
SELECT T1.I AS x,
       T2.I AS y,
       T3.I AS z,
       D.Domain
FROM dbo.DomainTable D
     CROSS JOIN Tally T1
     CROSS JOIN Tally T2
     CROSS JOIN Tally T3
WHERE T1.I <= @x
  AND T2.I <= @y
  AND T3.I <= @z;
如果@x、@y和@z的值为1000,那么这将创建1000^3 100000000行,并且它接受的值最多为10000


然而,我一秒钟也不建议您真的尝试一次创建超过100万行;这只会填充事务日志,可能会导致失败。

看起来发件人不是动态的。我想用自定义数字运行exec命令,@Matthew?100000000是个不错的数字,x、y或z的最大值是多少。但是数组大小不一定是对称的。它可能是10,6,1例如…100000000?认真地这就意味着你可能有100000000^3行,也就是1x10^27!!!为您更新了答案,@Matthew.from似乎不是动态的。我想用自定义数字运行exec命令,@Matthew?100000000是个不错的数字,x、y或z的最大值是多少。但是数组大小不一定是对称的。它可能是10,6,1例如…100000000?认真地这就意味着你可能有100000000^3行,也就是1x10^27!!!“为你更新了答案,@Matthew。