first table:dtHeader
Header
---------
Address
ZipCode
city
state
Second table:-dtReport
RowNumber-----Address------Zipcode---Region------city
1200 JC 00000 NYC Bronx
13000 RC 12345 NC Boston
我想删除dtreport中列名不在dtHeader中的所有列 因此结果dtReport将只有Address - zipcode - city列。 我不想创建另一个数据表,因为它有大量的行,即70000 我怎样才能做到这一点?
答案 0 :(得分:1)
未经测试,但dtReport列集合上的一个简单循环检查dtHeader列集合是否包含相等的命名列。如果没有从dtReport中删除该列。
SqlCommand cmdHeader = new SqlCommand("SELECT * FROM Header", conn);
SqlCommand cmdReport = new SqlCommand("SELECT * FROM Report", conn);
DataTable dtHeader = new DataTable();
DataTable dtReport = new DataTable();
SqlDataAdapter da1 = new SqlDataAdapter(cmdHeader);
da1.Fill(dtHeader)
SqlDataAdapter da2 = new SqlDataAdapter(cmdReport);
da2.Fill(dtReport);
for(int x = dtReport.Columns.Count - 1; x >= 0; x--)
{
DataColumn dc = dtReport.Columns[x];
if(!dtHeader.Columns.Contains(dc.ColumnName))
dtReport.Columns.Remove(dc.ColumnName);
}
诀窍是使用从最后一列到第一列的for..loop。通过这种方式,您可以在迭代集合时删除列(foreach无法执行此操作)
答案 1 :(得分:1)
您可以使用Enumerable.Except
查找必须从dtReport
var notAllowedColNames = dtReport.Columns.Cast<DataColumn>()
.Select(c=> c.ColumnName.ToUpperInvariant())
.Except(dtHeader.AsEnumerable().Select(r => r.Field<String>("Header").ToUpperInvariant()))
.ToList();
foreach(var colName in notAllowedColNames)
dtReport.Columns.Remove(colName);
我使用ToUpperInvariant
,因为ZipCode
在两个表中都有不同的情况。
答案 2 :(得分:0)
所有SQL答案都是这样的
INSERT INTO #TEMP_TABLE
SELECT c.name
FROM sys.tables AS t
INNER JOIN sys.columns AS c ON t.OBJECT_ID = c.OBJECT_ID
WHERE t.name = 'dtReport' AND c.name NOT IN (SELECT Header FROM dtHeader)
WHILE ((SELECT COUNT(*) FROM #TEMP_TABLE) > 0)
BEGIN
DECLARE @COLUMN_NAME VARCHAR(50) = (SELECT TOP 1 Header FROM #TEMP_TABLE)
ALTER TABLE PATRON DROP COLUMN @COLUMN_NAME
DELETE FROM #TEMP_TABLE WHERE Header = @COLUMN_NAME
END