Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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/7/sql-server/21.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 如何在循环中使用动态列名?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 如何在循环中使用动态列名?

Sql 如何在循环中使用动态列名?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个SQL语句: INSERT INTO Table1 ( A, B, C, D, ) SELECT id, name1, middlename1, lastname1 FROM Table2 我想将这个INSERT INTO语句放在一个循环中,每次迭代时,表2中的列都会发生变化,例如: INSERT INTO Table1 ( A, B, C, D, ) SELECT id, name2, middlename2, lastname2 FROM Table

我有一个SQL语句:

INSERT INTO Table1
(
  A,
  B,
  C,
  D,
)
SELECT id, name1, middlename1, lastname1 FROM Table2
我想将这个INSERT INTO语句放在一个循环中,每次迭代时,表2中的列都会发生变化,例如:

INSERT INTO Table1
(
  A,
  B,
  C,
  D,
)
SELECT id, name2, middlename2, lastname2 FROM Table2
有办法做到这一点吗

编辑-

表2
有以下列:

Name1, Name2, Name3, etc.
这些需要作为行进入另一个表:

Name1

Name2

Name3

...

听起来您需要在表中取消填充表,然后插入它。这会将您的转换转换为行

根据您的SQL Server版本,您有不同的选项

如果您使用的是SQL Server 2008+,则可以使用
交叉应用

insert into table1 (A, B, C, D)
select t.id,
  c.col1,
  c.col2,
  c.col3
from yourtable t
cross apply
(
  values 
    (name1, middlename1, lastname1),
    (name2, middlename2, lastname2),
    (name3, middlename3, lastname3)
) c (col1, col2, col3);
或者您可以使用
UNION ALL
查询:

insert into table1 (A, B, C, D)
select id, name1 col1, middlename1 col2, lastname1 col3
from yourtable
union all
select id, name2 col1, middlename2 col2, lastname2 col3
from yourtable
union all
select id, name3 col1, middlename3 col2, lastname3 col3
from yourtable

听起来您需要在表中取消填充表,然后插入它。这会将您的转换转换为行

根据您的SQL Server版本,您有不同的选项

如果您使用的是SQL Server 2008+,则可以使用
交叉应用

insert into table1 (A, B, C, D)
select t.id,
  c.col1,
  c.col2,
  c.col3
from yourtable t
cross apply
(
  values 
    (name1, middlename1, lastname1),
    (name2, middlename2, lastname2),
    (name3, middlename3, lastname3)
) c (col1, col2, col3);
或者您可以使用
UNION ALL
查询:

insert into table1 (A, B, C, D)
select id, name1 col1, middlename1 col2, lastname1 col3
from yourtable
union all
select id, name2 col1, middlename2 col2, lastname2 col3
from yourtable
union all
select id, name3 col1, middlename3 col2, lastname3 col3
from yourtable

你能发布你的表结构吗,可能有更好的方法来实现这一点?同意@BlueFoots,我认为你可能不需要一个循环来实现这个目的。如果你详细说明,可能会有一个更好的解决方案。你能发布你的表结构吗,可能有更好的方法来做到这一点吗?同意@BlueFoots,我认为你可能不需要一个循环来达到这个目的。如果你再详细说明一下,可能会有更好的解决方案。我想交叉申请是我要找的。试一下,几分钟后再报告。谢谢蓝:)我想交叉申请是我要找的。试一下,几分钟后再报告。谢谢蓝:)