SQL:
CREATE FUNCTION dbo.fnRandomForeNames ()
RETURNS VARCHAR(50)
AS
BEGIN
RETURN (
SELECT TOP 1 [FirstName]
FROM [tmp_ForeNames]
ORDER BY (SELECT new_id from GetNewID)
)
END
GO
dbo.fnRandomSurNames() 等的类似功能。
UPDATE Table1
SET firstname = dbo.fnRandomForeNames(),
lastname = dbo.fnRandomSurNames(),
address1 = dbo.fnRandomAddress1(),
address2 = dbo.fnRandomAddress2(),
address3 = dbo.fnRandomAddress3(),
birthdate = DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 3650), '1990-01-01')
我的 C# 代码:
private void RunThis(string connString, StreamReader sr)
{
sr.BaseStream.Position = 0;
string sqlQuery = sr.ReadToEnd();
using (SqlConnection connection = new SqlConnection(connString))
{
Server server = new Server(new ServerConnection(connection));
server.ConnectionContext.StatementTimeout = 4200;
server.ConnectionContext.ExecuteNonQuery(sqlQuery);
}
sr.Close();
}
...........
RunThis(e.Argument.ToString(), _updateClaim);
e.Argument.ToString()
连接字符串在哪里。
脚本运行较早,CREATE FUNCTION
运行时间非常短。此外,名称存储在 tmp 数据库中,这些名称是通过数组在 C# 中输入的。这些也需要很少的时间来运行。
表 1 包含大约 140,000 行,大约需要 140,000 行。14分钟完成。
我也尝试过使用参数化的 SQL 查询,跳过 tmp 表和 SQL 函数,而是创建 SQL 查询并从代码中执行它,如下所示:
UPDATE Table1
SET lastname = '{0}',
firstname = '{1}',
birthdate = DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 3650), '1990-01-01'),
address1 = '{2}',
address2 = '{3}',
address3 = '{4}'
WHERE u_id = '{6}'
还有一些 C#:
using (SqlConnection connection = new SqlConnection(connString))
{
connection.Open();
for (int i = 0; i < arraySize; ++i)
{
string updateString = string.Format(updateString2, GetRandomSurname(), GetRandomForeName(), GetRandomAddress1(), GetRandomAddress2(), GetRandomAddress3(), "", ids[i]);
SqlCommand cmd = new SqlCommand(updateString, connection);
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
}
}
后一种方法也需要 14 分钟以上。
关于如何减少更新表格所需时间的任何想法?
谢谢。