【问题标题】:Populate table where columns match | TSQL填充列匹配的表 | SQL
【发布时间】:2013-07-31 13:56:26
【问题描述】:

这是我的主桌:

select Name, Age, Race, from Person

我根据我的 XML 文件中可用的内容创建了一个临时表,因此临时表可能包含我的表 Person 中的所有字段,或者混合顺序中只有 1 个或 2 个。

Select * from #MyTempTable = Mike, 44

也可以

Select * from #MyTempTable = Race, Mike

是否可以用我的临时表中的任何值填充我的Person 表?

因此,如果#MyTempTable 有一个列Age,则将Person 表中的Age 值填充到表Age 中的列Person 中

【问题讨论】:

  • 哪个 DBMS:SQL Server、Sybase ASE?

标签: sql-server tsql temp


【解决方案1】:

我建议将 XML 转换为查询以创建临时表 (SQL Server shred XML to temp table)。然后你可以对 Age 和 Race 有单独的更新语句,例如:

UPDATE Person
SET Age = Imported.Age
FROM Person
   INNER JOIN Imported ON Imported.Name = Person.Name
WHERE Imported.Age IS NOT NULL

等等。

【讨论】:

    【解决方案2】:

    SQL Server 解决方案:

    您可以尝试以下解决方案之一:

    IF EXISTS(SELECT * FROM tempdb.sys.columns c 
        WHERE c.object_id=OBJECT_ID(N'tempdb..#MyTempTable' AND c.name='Age')
    BEGIN
        INSERT INTO #MyTempTable(Name,Age)
        SELECT ... FROM ... CROSS APPLY XmlCol.nodes('/...') a(b)
    END
    ELSE IF EXISTS(SELECT * FROM tempdb.sys.columns c 
        WHERE c.object_id=OBJECT_ID(N'tempdb..#MyTempTable' AND c.name='Race')
    BEGIN
        INSERT INTO #MyTempTable(Name,Race)
        SELECT ... FROM ... CROSS APPLY XmlCol.nodes('/...') a(b)   
    END
    

    或

    INSERT INTO #MyTempTable(Name,Age,Race)
    SELECT ... AS Name, 
        a.b.value('(@Age)[1]','TINYINT') AS Age
        a.b.value('(@Race)[1]','NVARCHAR(50)') AS Race, ...
        CASE WHEN <condition for Race column> THEN value ELSE NULL AS Race   
    FROM ... CROSS APPLY XmlCol.nodes('/...') a(b)
    

    注意1:因为从sys.columns系统视图读取数据需要特殊权限(参见link),最简单的解决方案是第二种解决方案。

    注意 2:从 SQL Server 2008 开始,您可以使用 SPARSE columns 来减少那些具有许多 NULL 列的列的存储大小。

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 2012-12-02
      • 1970-01-01
      • 2020-04-29
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      相关资源
      最近更新 更多