【问题标题】:Loop through each column name from one table and insert that name into another table?循环遍历一个表中的每个列名并将该名称插入另一个表?
【发布时间】:2019-07-27 08:51:49
【问题描述】:

我有两张桌子。一个表有 500 列的列表。另一个表像这样引用每个列名

Select Top 1 * from MyReferenceTable

返回结果

(69, 'FirtName', 1, NULL)
(69, 'LastName', 2, NULL)

其中 'FirstName' 是实际表中列的名称。

所以我想用另一个表中的列名来填充这个引用表

Insert Into MyReferenceTable
FileId, ColumnName1, ColumnOrder, DefaultValue
Values(69, Select ColumnName From OtherTable? ,
       Select Next Sequential Identity?, NULL)

我的问题是如何遍历另一个表以获取每一行的列名,同时在 sequenceOrder 中插入一个标识作为 ColumnOrder?

为超过 500 列手动输入插入语句需要花费很多时间。

【问题讨论】:

  • 这是一个非常糟糕的设计选择,你现在应该避免它。如果您只是想要表中列的名称,您有 sys.columnsINFORMATION_SCHEMA.COLUMNS 对象,但您不应该存储这些信息(因为它已经可供您使用)。如果您打算使用这些数据来尝试创建将列值“替换”为列名称的语句,您会(非常)很快发现这不起作用。
  • 感谢您的 cmets。这个决定超出了我的薪酬等级。
  • 那么那个薪级的人应该更清楚。看来我的假设是正确的,这意味着您将很快发现您可能会陷入动态 SQL、没有约束的外键和/或由于大量查询计划而导致的糟糕查询计划。 LEFT JOIN 的。您可能想查看一些讨论此类设计及其局限性/缺陷并提出它们的文章。如果您现在可以将项目朝着正确的方向推进,那么您会发现将来事情会容易得多。

标签: sql sql-server tsql ssms sql-server-2016


【解决方案1】:

这是一个糟糕的主意,但您的问题的答案很直接:

INSERT INTO MyReferenceTabel (FileId, ColumnName1, ColumnOrder, DefaultValue)
    SELECT 69, [name], [column_id], NULL
      FROM sys.columns 
     WHERE [object_id] = OBJECT_ID('MyOtherTable')

基本上,您制作一个返回所需值的 SELECT 语句,然后在其上添加 INSERT 语句。

但是,这又是一种糟糕的设计选择,最终会咬你一口。但是知道如何获取这些信息仍然很好,所以我在这里发布这个示例。

【讨论】:

  • 非常感谢我所需要的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
相关资源
最近更新 更多