c# - SQL 中的字符串函数而不是 C#

标签 c# sql sql-server sql-server-2008

<分区>

我有 2000000 strip 有客户名称的 sql 记录。我想改变如下。

示例数据:

Name
अमरीनaa मोयोद्दिनa शेखa
रऊफa वाहेदaa शेखa 
शहेदाबेगमaa रऊफaa शेखa
इम्रानa रउफ़aa शेखa 
दत्तुaa
कैलास धुमाळ
विलास दत्तु धुमाळ 
बिस्मिल्ला बी अ.हमीद खॉन
इस्माईल खॉन अ.हमीद खॉन 
नसरीन बेगम इस्माईल खान 
अ.हमिद खॉन इमाम खॉन
अजमेर खॉ इमाम खॉ
सुग्रा बी अजमेर खॉ
हनीफाबी अजमेर 
गौस अजमेर खान 
यासीन अजमेर खान 
राबिया बी मुश्ताक अली शेख
मो.सिंकंदर अली अन्वरअली शेख 
गफार मोयीन शेख 
नंदाबाई अशोक 
सचिन आशोक दिवेकर
सोनाजी नामदेव बोराडे
व्दारका राजू गायकवाड 
लिलाबाई सोनाजी बोराडे 
शारदाबाई राजू जगदाळे
अनिता अर्जुन जगदाळे
मंदा सुनील वाढेकर 
विठ्ठल दगडू 
सुनिल विश्वनाथ वाढेकर
शिवाजी विश्वनाथ
गयाबाई शिवाजी 
बाळू विश्वनाथ
वैशाली बाळू वाढेकर 
पांडुरंग नामदेब वाघ नामदेव 
हिराबाई पांडुरंग बाघ पांडुरंग 
सवीता संतोष किर्तीकर
चंद्रकला प्रल्हाद
संतोष प्रल्हाद
अनिल प्रल्हाद
विजय प्रल्हाद किर्तीकर 
राजेंद्र काशिनाथ 
हिराबाई राजेंद्र 
सुरेश पैठणे
नुतन सुरेश 
गौतम पैठणे
शारदा गौतम पैठणे गौतम
राजू अंबादास 
शोभाबाई राजू
सुनिता गोटीराम गायकवाड
बाळकृष्ण भानुदास दुलग

上面的数据有名字,中间名和姓氏,我想要:

  1. 在名字的每个单词中,aa 都应替换为单个 a,它是名字中的任何地方(अमरीनaa 将是 अमरीन 和 रऊफaa 将是 IDऊफ)
  2. 在名字的每个单词中,a 应该被删除,它在单词的最后(शेखa 将是 शेख 和 मोयोद्दिनa 将是 मोयोद्दिन)
  3. 如果名字超过 2 个单词,那么最后一个单词将排在第一个(विलास दत्तु धुमाळ 将是धुमाळ विलास दत्तु)
  4. 如果名字少于 3 个单词,那么它将与 कैलास धुमाळ 将 कैलास धुमाळ 和 दत्तुaa 将是 दत्तुaa)
  5. 应删除所有以空格开头和结尾的单词。

对于上述要求,我正在使用 C# 硬代码来完全填充,但需要 5 到 8 个小时才能完成,我希望这应该在 sql 端完成。

这是我的 C# 代码:

 int _pcount = 0;
string _qr = "";
string _Name = "";
string _FinalName = "";
string _FNAME = "";
string _LastName = "";
string _MiddleName = "";
string _ID = "";
string[] _Split;
List<string> _a = new List<string>();
DataRowCollection _dr = _CDatabase._MGetDataRows("SELECT _ID, _FULLNAME FROM MYTABLE ORDER BY _FULLNAME"); // This is a function will execute a sql and return DataRowCollection
progressBar1.Maximum = _dr.Count + 1;
progressBar1.Value = 0;
using (SqlConnection con = new SqlConnection("MyConStr"))
{
    con.Open();
    using (SqlTransaction trans = con.BeginTransaction(IsolationLevel.ReadCommitted))
    {
        try
        {
            foreach (DataRow _row in _dr)
            {
                progressBar1.Value++;
                _pcount++;
                if (_pcount >= 100)
                {
                    _pcount = 0;
                    Application.DoEvents();
                }
                _ID = _CConvert._MConvertToString(_row[0]);
                _Name = _CConvert._MConvertToString(_row[1]);

                _Split = _Name.Split(' ');
                _a = _Split.ToList();
                _a.Remove(" ");
                _a.Remove(" ");
                _a.Remove(" ");
                _a.Remove(" ");
                _a.Remove(" ");
                _a.Remove(" ");
                switch (_a.Count)
                {
                    case 0:
                        {
                            _FNAME = _FinalName = _Name;
                            _FNAME = _Name;
                            _LastName = "";
                            _MiddleName = "";
                            break;
                        }
                    case 1:
                        {
                            _FNAME = _FinalName = _Name;
                            _FNAME = "";
                            _LastName = _Name;
                            _MiddleName = "";
                            break;
                        }
                    case 2:
                        {
                            _FNAME = _FinalName = _Name;
                            _FNAME = _a[0];
                            _LastName = _FNAME;
                            _MiddleName = _a[1];
                            break;
                        }

                    case 3:
                        {
                            _FinalName = _a[2] + " " + _a[0] + " " + _a[1];
                            _FNAME = _a[0];
                            _MiddleName = _a[1];
                            _LastName = _a[2];
                            break;
                        }
                    case 4:
                        { // nasreen begum ismail khan
                            _FinalName = _a[3] + " " + _a[0] + " " + _a[1] + " " + _a[2];
                            _FNAME = _a[0] + " " + _a[1]; // nasreen begum
                            _MiddleName = _a[2];// ismail
                            _LastName = _a[3];//khan
                            break;
                        }

                    case 5:
                        { // jaibunnisa begum gulam dastagir sahab syed
                            _FinalName = _a[4] + " " + _a[0] + " " + _a[1] + " " + _a[2] + " " + _a[3];
                            _FNAME = _a[0] + " " + _a[1]; // jaibunnisa begum
                            _MiddleName = _a[2] + " " + _a[3];// gulam gastagir
                            _LastName = _a[4];//syed
                            break;
                        }

                    case 6:
                        { // jaibunnisa begum gulam dastagir syed
                            _FinalName = _a[5] + " " + _a[0] + " " + _a[1] + " " + _a[2] + " " + _a[3] + " " + _a[4];
                            _FNAME = _a[0] + " " + _a[1]; // jaibunnisa begum
                            _MiddleName = _a[2] + " " + _a[3] + " " + _a[4];// gulam gastagir
                            _LastName = _a[5];//syed
                            break;
                        }
                    case 7:
                        { // jaibunnisa begum gulam dastagir syed
                            _FinalName = _a[6] + " " + _a[0] + " " + _a[1] + " " + _a[2] + " " + _a[3] + " " + _a[4] + " " + _a[5];
                            _FNAME = _a[0] + " " + _a[1]; // jaibunnisa begum
                            _MiddleName = _a[2] + " " + _a[3] + " " + _a[4] + " " + _a[5];// gulam gastagir
                            _LastName = _a[6];//syed
                            break;
                        }
                    default:
                        {
                            _FinalName = _Name;
                            _FNAME = "";
                            _LastName = "";
                            _MiddleName = "";
                            break;
                        }
                }

                _qr = "UPDATE MYTABLE SET _FULLNAME = N'" + _FinalName + "' WHERE _ID = '" + _ID + "'";
                _mExcute(_qr, con, trans);
            }
            trans.Commit();
            con.Close();
            trans.Dispose();
            MessageBox.Show("DONE");
        }
        catch (Exception ex)
        {
            trans.Rollback();
            con.Close();
            _CShowMessageBox._MShowErrorMessageBox(ex.Message);
        }
    }
}

最佳答案

我不清楚您的字符串处理是否可以轻松地在 SQL 中实现,但为了更快,它必须允许基于集合的方法。像这样的东西:

UPDATE MYTABLE SET _FULLNAME = dbo.getFullName(paramters)

您的代码运行缓慢的主要原因是大量的 UPDATE 语句。如果您使用 SQL Profiler,您将看到您产生了多少事件。

在尝试转换为 SQL 之前,我会尝试以下操作:

1) 将您的全名预先计算到字符串列表中 2)创建一个缓冲表,其结构如下(Buffer):

ID INT NOT NULL,
FullName NVARCHAR(255) NOT NULL

3) 使用Bulk Insert坚持到缓冲区。 Bulk insert速度快得多(如果不是快几十倍的话),因为它最大限度地减少了应用程序和 SQL Server 之间的往返行程。

4) 使用语句从缓冲区更新到最终表

UPDATE Dest
SET T.FullName = B.FullName
FROM MYTABLE T
JOIN Buffer B ON B.ID = T.ID

关于c# - SQL 中的字符串函数而不是 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40682458/

相关文章:

c# - 快速 IEnumerable<enum> 到 List<enum 2> 对话

c# - 是否可以使用 IntPtr 在另一个程序中激活选项卡?

c# - 如何导出到 Excel?

sql - 如何在Powershell脚本传入的SQL脚本中使用变量

asp.net - 我应该创建几个小型应用程序数据库还是一个大型应用程序数据库?

c# - 在 javascript 中调用不带参数的 C# 库函数

mysql - SQL 查询通过使用不同的特征在一列中添加值来插入新列

SQL 2008 设置兼容级别

c# - 列出带有实例的可用 SQL Server 不包括 SQL Server Express

c# - 在查询中参数化 WHERE 子句