如果列大于1024,如何拆分DataTable?
How to split DataTable if columns are greater than 1024?
我有数据 table 有 3k 和更多的列,我们都知道 SQL 表不支持超过 1024 列。我将有另一个 table它.
如果列数大于 1024,我只需要拆分 DataTable。
我需要一个高效的方法。
提前致谢。
阅读有关 规范化 的信息,因为通常正确规范化的数据库不需要 table 具有 1024+ 列。如果没有帮助,您的问题可以通过例如解决
1) 计算列数
SELECT count(*)
FROM information_schema.columns c
JOIN information_schema.tables t ON c.TABLE_NAME = t.TABLE_NAME
AND c.table_schema = t.table_schema
WHERE table_type = 'base table'
and c.table_name ='table_name_here'
2) 如果超出预期 - 创建一个新的 table
CREATE TABLE new_table_name_here
(...)
我从未见过包含如此多列的数据库 table。
我不知道,您的 DataTable 通常有多少行。您可以 transpose DataTable 或以下是如何拆分 DataTable 的代码片段。我将@jdweng 的想法与 copy table 和 al 值一起使用,然后向后删除不需要的列。我无法评估这是否是最有效的方法。我没有在带行的 DataTable 上测试它。
static List<DataTable> SplitTables(DataTable largeTable)
{
var tables = new List<DataTable>();
int chunkSize = 1024;
int cycles = largeTable.Columns.Count / chunkSize;
for (int i = 0; i <= cycles; i++)
{
var tempTable = largeTable.Copy();
for (int j = largeTable.Columns.Count - 1; j >= 0; j--)
{
if (!(j >= i * chunkSize && j < (i + 1) * chunkSize))
{
tempTable.Columns.RemoveAt(j);
}
}
tables.Add(tempTable);
}
return tables;
}
我有数据 table 有 3k 和更多的列,我们都知道 SQL 表不支持超过 1024 列。我将有另一个 table它.
如果列数大于 1024,我只需要拆分 DataTable。
我需要一个高效的方法。
提前致谢。
阅读有关 规范化 的信息,因为通常正确规范化的数据库不需要 table 具有 1024+ 列。如果没有帮助,您的问题可以通过例如解决
1) 计算列数
SELECT count(*)
FROM information_schema.columns c
JOIN information_schema.tables t ON c.TABLE_NAME = t.TABLE_NAME
AND c.table_schema = t.table_schema
WHERE table_type = 'base table'
and c.table_name ='table_name_here'
2) 如果超出预期 - 创建一个新的 table
CREATE TABLE new_table_name_here
(...)
我从未见过包含如此多列的数据库 table。 我不知道,您的 DataTable 通常有多少行。您可以 transpose DataTable 或以下是如何拆分 DataTable 的代码片段。我将@jdweng 的想法与 copy table 和 al 值一起使用,然后向后删除不需要的列。我无法评估这是否是最有效的方法。我没有在带行的 DataTable 上测试它。
static List<DataTable> SplitTables(DataTable largeTable)
{
var tables = new List<DataTable>();
int chunkSize = 1024;
int cycles = largeTable.Columns.Count / chunkSize;
for (int i = 0; i <= cycles; i++)
{
var tempTable = largeTable.Copy();
for (int j = largeTable.Columns.Count - 1; j >= 0; j--)
{
if (!(j >= i * chunkSize && j < (i + 1) * chunkSize))
{
tempTable.Columns.RemoveAt(j);
}
}
tables.Add(tempTable);
}
return tables;
}