如何根据SQL Server中的条件填充表数据

时间:2016-03-03 04:46:10

标签: sql sql-server sql-server-2008

我的表格定义如下:

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

这些列名称不固定,表格列数在不同的.CSV文件中有所不同,具体取决于提供.CSV文件的客户。

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

现在,我必须用UserDataDSU表格填写UserData表,如下所示。

如果UserData(ColC)存在并且有数据,请填写UserDataDSU(ColD),然后将ColD设为NULL

如果UserData(ColA)存在并且有数据,请填写UserDataDSU(ColE),然后将ColE设为NULL

如果UserData(ColB)存在并且有数据,请填写UserDataDSU(ColF),然后将ColF设为NULL

当然,对于UserDataDSU中的所有剩余列(例如ColGColHColIColJ在其couter表中没有数据 - UserData,所有这些都应由NULLs填写。

请记住,对于其他客户提供的其他.CSV文件数据可能存在于这些列中的某些或所有列

任何人都可以建议如何在存储过程中执行此操作。

1 个答案:

答案 0 :(得分:0)

TLDR

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

以下是所有这些

的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

请注意我测试了这个,这对我有用。 使用的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));