如何填充在SQL Server基于条件表数据

问题描述:

我的表的定义如下图所示:如何填充在SQL Server基于条件表数据

UserData (ColA, ColB, ColC) - 此表由.CSV文件罢了。

这些列名称不固定,表列数量因不同的.CSV文件而异,具体取决于提供.CSV文件的客户。

UserDataDSU (ColD, ColE, ColF, ColG, ColH, ColI, ColJ) 

现在,我必须填写UserDataDSU表中包含UserData表中的数据。

如果UserData(ColC)存在,并且有数据,然后填写UserDataDSU(ColD),否则设置ColDNULL

如果UserData(ColA)存在,并且有数据,然后填写UserDataDSU(ColE),否则设置ColENULL

如果UserData(ColB)存在,它有数据,然后填写UserDataDSU(ColF) else ColF as NULL

当然,对于所有的re在UserDataDSU(如ColG,ColH,ColI,ColJColJ的数据列中没有数据 - UserData,所有这些都应该填写NULLs

请记住,对于一些其他的.CSV文件从其他客户的数据可能存在一些或所有这些柱

任何人都可以请建议如何做到这一点的存储过程里面了。

TLDR

您可以使用sys.objects来生成匹配根据你的业务逻辑表之间的列,然后使用该映射来创建动态INSERT SQL脚本。

下面是这一切

DECLARE @sql varchar(max) -- will be used for holding dynamic SQL script 
-- this temp table will hold the mapping 
CREATE TABLE #temp (DColName varchar(100), SColName varchar(100), OrderCol int) 
--inserting mapping into temp table based on business logic 
INSERT INTO #temp 
SELECT 
    Dest.name, 
    Source.name, 
    Dest.object_id -- ordering criteria to generate accurate mapping in script 
FROM 
    sys.columns Dest LEFT JOIN 
    (
    SELECT 
     name, 
     CASE 
      WHEN name='ColC' THEN 'ColD' 
      WHEN name='ColA' THEN 'ColE' 
      WHEN name='ColB' THEN 'ColF' 
      ELSE name 
     END as Newname -- business logic for matching 
    FROM 
     sys.columns 
     WHERE 
     object_id IN (
      SELECT object_id FROM sys.tables WHERE name ='UserData' 
        ) 
    )source 
    ON Dest.Name=Source.NewName 
    WHERE 
     Dest.object_id IN (
          SELECT object_id 
          FROM sys.tables 
          WHERE name ='UserDataDSU' 
         ) 

--create the dynamic SQL 

SELECT @sql = 
'INSERT INTO UserDataDSU ('+ 
--insert column list of destination table 
STUFF((SELECT ','+ Dcolname FROM #temp WHERE Scolname IS NOT NULL ORDER BY OrderCol ASC FOR XML PATH('')),1,1,'') + 
') SELECT '+ 
--insert column list of source table 
STUFF((SELECT ','+ Scolname FROM #temp ORDER BY OrderCol ASC FOR XML PATH('')),1,1,'') + 
' FROM UserData' 

-- execute the dynamic SQL 
EXEC(@sql) 

-- now drop the temp table 
DROP TABLE #temp 

请注意,我试用了这个工作对我的SQL脚本。 CREATE INSERT使用的表格脚本低于

create table UserData (ColA varchar(100), ColB varchar(100), ColC varchar(100)); 
insert into UserData values ('A1','B1','C1'),('A2','B2','C2'); 
create table UserDataDSU (ColD varchar(100), ColE varchar(100), ColF varchar(100), ColG varchar(100), ColH varchar(100), ColI varchar(100), ColJ varchar(100));