【发布时间】:2010-12-28 17:16:14
【问题描述】:
当我尝试从 C# 代码中读取 SQL Server 2005 中的行时遇到问题
想法:
在我的数据库 (SQL Server 2005 Express) 中有一个表,其中有一列(数据类型为 ntext)包含 HTML 代码。
在我的 C# 应用程序中,用户可以输入一个句子(HTML 代码)并搜索包含该句子的行。
我的应用生成的查询是:
USE test
SELECT
al.aal_Id As ID,
al.aal_Description As Opis,
au.au_Title As Tytul_szablonu,
au.au_Note As Nazwa_szablonu
FROM dbo.au_Allegro al
LEFT OUTER JOIN dbo.au__Auction au ON (al.aal_AuctionId = au.au_Id)
WHERE
au.au_Type = 11
AND al.aal_Description COLLATE SQL_Latin1_General_CP1_CS_AS LIKE '%%' ESCAPE '\'
在我的应用程序中,我正在转换特殊字符(例如 ',)并添加转义字符。
用户尝试搜索很长的句子(大约 7000 多个字符),当他尝试这样做时,sqlserver.exe 进程消耗了他所有的 RAM 内存,搜索时间大约是 30 多分钟(他有大约 1000 多行在此表中)。
查询返回 0 行。
当他尝试在 SQL Server Management Studio 中运行(同样的)查询时,数据库会在几秒钟内显示结果(有行)。
在我的应用中,我使用SqlDataAdapter:
System.Data.DataTable dt = new System.Data.DataTable();
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
cmd.CommandTimeout = 0;
cmd.Connection = conn;
System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(kwerenda, conn);
try
{
da.Fill(dt);
}
我试过SqlDataReader:
dr = cmd.ExecuteReader();
while (dr.Read())
{
string id = dr["ID"].ToString();
string opis = dr["Opis"].ToString();
string tytul = dr["Tytul_szablonu"].ToString();
string nazwa = dr["Nazwa_szablonu"].ToString();
dt.Rows.Add(id, opis, tytul, nazwa);
}
当我尝试在我的测试数据库中模拟这一点时,我在搜索(同样的)句子方面没有任何问题。
你有什么建议吗?
我无法对用户数据表进行任何更改,我无法去找他检查发生了什么。
【问题讨论】:
-
LIKE '%%'不会匹配所有行吗? -
@John Saunders:这将匹配所有行并且这样做没有索引的任何好处。此外,它将检查每一行中的每个字符,只返回所有字符。我猜查询时间与存储的数据量有关。
-
@Chris:将
ntext添加到该等式中,我认为我们已经赢了。 -
@Chris:我无法更改列类型,我正在其他应用程序数据库中搜索(我的应用程序不是该数据库的所有者)
-
@user:请编辑您问题中的查询以更接近现实。如果您实际上不搜索
%%,那么为什么告诉我们您搜索过?