Sql 如何使用映射表更新列值为null
我有这样的CustomData表值Sql 如何使用映射表更新列值为null,sql,sql-server,Sql,Sql Server,我有这样的CustomData表值 +----------+----------+-------------+----------------+--------------------+-------------------+ | Column_1 | Column_2 | Column_3 | Column_4 | Column_5 | | +----------+----------+-------------+---
+----------+----------+-------------+----------------+--------------------+-------------------+
| 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来完成这些任务。我很困惑。也许我不是唯一一个。