我觉得这可能是个疯狂的问题,如果有人对如何做到这一点有更好的了解,请务必告诉我。
我有一个.Net C#项目在工作中根据他们必须遵守的公司标准验证某些表。这些表可以在SQL Server或DB2上。当一个表最初添加到程序中时,我使用information_schema.columns
为sql的select语句或db2的syscat.columns
来收集有关该表的元数据/信息。获得该数据后,我将其存储在sql server上的一个表中(我们称之为all_table_information
),该表包含在程序中验证的每个表的相同信息。
如果表是SQL表,我可以运行此查询(当然只将其限制为我想要的表中的列):
insert into [all_table_information]
(table_id, column_name, data_type, max_char_length)
select table_id, column_name, data_type, character_maximum_length
from information_schema.columns
where ...restrict to needed table...
然后在SqlCommand中执行它。但如果它是DB2表,我必须运行此查询(再次限制为我需要的列):
select tabschema, tabname, colname, typename, length
from syscat.columns
where ...restrict to needed table...
然后获取带有结果的DataReader,并使用以下方法循环插入每一行:
while (dr.Read())
{
insert into [all_table_information]
(table_id, column_name, data_type, max_char_length) values
(..."'" + dr["whatever"] + "', '" + ....)
...execute sql here...
}
dr.Close();
这样做是有效的,但速度很慢,所以我只是想知道是否有人在一个声明中做到这一点?我知道你也可以将db2表信息保存到数据表中,但是你可以直接对数据表运行查询吗?
谢谢, 莱恩
答案 0 :(得分:1)
您是否考虑过使用SSIS,而不是编写应用程序来进行操作?
答案 1 :(得分:1)
您最好在SqlCommand
之外创建dr.Read()
并使用参数。这将提高性能和安全性,您不必担心动态正确形成语法。像这样......
SqlCommand insertCommand = new SqlCommand(connection);
insertCommand.CommandText = @"
insert into [all_table_information]
(table_id, column_name, data_type, max_char_length)
values
(@table_id, @column_name, @data_type, @max_char_length)";
...create your parameters and add them here
insertCommand.Prepare(); //precompiles the query
while (dr.Read())
{
...set parameter values
insertCommand.ExecuteNonQuery();
}
dr.Close();
答案 2 :(得分:1)
您可能想要使用SqlBulkCopy: MSDN
它比为每一行单独插入要快得多。