Sql 如何使用映射表更新列值为null

Sql 如何使用映射表更新列值为null,sql,sql-server,Sql,Sql Server,我有这样的CustomData表值 +----------+----------+-------------+----------------+--------------------+-------------------+ | Column_1 | Column_2 | Column_3 | Column_4 | Column_5 | | +----------+----------+-------------+---

我有这样的CustomData表值

+----------+----------+-------------+----------------+--------------------+-------------------+
| Column_1 | Column_2 |  Column_3   |    Column_4    |      Column_5      |                   |
+----------+----------+-------------+----------------+--------------------+-------------------+
|        1 | Name     | CompanyName | CompanyAddress | CompanyPhoneNumber | CompanyDepartment |
+----------+----------+-------------+----------------+--------------------+-------------------+
映射表是

+----+----------------+------------------+------------+
| ID |   FieldName    |    DataValue     | ColumnName |
+----+----------------+------------------+------------+
|  1 | CompanyPhone   | 0515784          | Column_1   |
|  2 | CompanyAddress | USATaxes         | Column_2   |
|  4 | CompanyName    | Software         | Column_4   |
|  5 | Email          | HR@telesquad.com | Column_5   |
+----+----------------+------------------+------------+
在映射表中,列_3不存在,我想将自定义数据列_3的值集更新为NULL


我们如何才能完成这项任务。有人能帮我吗?

虽然下面的答案不能处理将列_3更新为NULL的问题,但它确实说明了如何在CustomData/Mapping之间提取一个结果集,这可能比编写动态SQL更容易使用。不幸的是,我不太了解您的数据结构或请求,不知道您真正需要的是什么

/* Mock-up tables and data */

DECLARE @CustomData table (
    Column_1 int, Column_2 varchar(50), Column_3 varchar(50), Column_4 varchar(50), Column_5 varchar(50)
);

DECLARE @Mapping table (
    ID int, FieldName varchar(50), DataValue varchar(50), ColumnName varchar(50) 
);

INSERT INTO @CustomData VALUES 
    ( 1, 'Name', 'CompanyName', 'CompanyAddress', 'CompanyPhoneNumber' );

INSERT INTO @Mapping VALUES
    ( 1, 'CompanyPhone', '0515784', 'Column_1' ),
    ( 2, 'CompanyAddress', 'USATaxes', 'Column_2' ),
    ( 4, 'CompanyName', 'Software', 'Column_4' ),
    ( 5, 'Email', 'HR@telesquad.com', 'Column_5' );

/* Fetch a resultset between CustomData and Mapping via column names */

SELECT
    d.c.value( 'fn:local-name(.)', 'varchar(50)' ) AS CustomDataColumn,
    d.c.value( '.', 'varchar(50)' ) AS CustomDataValue,
    Map.FieldName AS MappingFieldName
FROM (
    SELECT CAST( ( SELECT * FROM @CustomData FOR XML PATH ( 'column' ), ROOT ( 'data' ) ) AS xml ) AS DataXml
) AS CustData
CROSS APPLY CustData.DataXml.nodes( '//data/column/*' ) d( c )
LEFT JOIN @Mapping AS Map
    ON d.c.value( 'fn:local-name(.)', 'varchar(50)' ) = Map.ColumnName;
返回

+------------------+--------------------+------------------+
| CustomDataColumn |  CustomDataValue   | MappingFieldName |
+------------------+--------------------+------------------+
| Column_1         | 1                  | CompanyPhone     |
| Column_2         | Name               | CompanyAddress   |
| Column_3         | CompanyName        | NULL             |
| Column_4         | CompanyAddress     | CompanyName      |
| Column_5         | CompanyPhoneNumber | Email            |
+------------------+--------------------+------------------+

只有使用动态SQL才能实现这一点。老实说,这样的要求表明你有设计缺陷,应该重新考虑设计;设计不应该要求动态SQL来完成这些任务。我很困惑。也许我不是唯一一个。