【发布时间】:2014-11-16 00:24:45
【问题描述】:
我在 c# 代码中嵌入了以下 sql。
这是一个搜索查询,搜索是基于城市和地址的。
查询如下,
string sql = "declare @v int;set @v=-1;declare @st varchar(1000);";
sql += "set @st='select PLACEID,LEFT(CONVERT(NVARCHAR(1000),description),500)+''...'' as des1,LOCATIONCITY,ADDRESS,DateT,RENT from infoone where '";
int x = 0;
string ft = "";
string sql1 = "";
sql += "; Select @v= count(address) from infoone where(";
foreach (string s in str)
{
if (x == 0)
{
ft += " " + s;
sql += "(address like '%" + ft.Remove(0, 1) + "%')";
sql1 += "(address like ''%" + ft.Remove(0, 1) + "%'')";
}
else
{
ft += " " + s;
sql += " OR (address like '%" + ft.Remove(0, 1) + "%')";//ft.Remove(0, 1)
sql1 += " OR (address like ''%" + ft.Remove(0, 1) + "%'')";//ft.Remove(0, 1)
}
x++;
}
sql += "); if @v > 0 begin set @st=@st+'" + sql1 + "'+ 'and ('; end else begin set @st=@st+'" + sql1 + "'+ 'or ('; end ";
sql1 = "";
x = 0;
sql += "; Select @v= count(locationcity) from infoone where(";
foreach (string s in str)
{
if (x == 0)
{
sql += "(locationcity like '%" + s + "%') ";
sql1 += "(locationcity like ''%" + s + "%'') ";
}
else
{
sql += " OR (locationcity like '%" + s + "%') ";
sql1 += " OR (locationcity like ''%" + s + "%'') ";
}
x++;
}
sql += "); if @v>0 begin set @st=@st+'" + sql1 + ")'+' and ('; end else begin set @st=@st+'" + sql1 + ")'+ 'or ('; end ";
x = 0;
sql1 = "";
ft = "";
//sql += " and (";
sql += "Select @v= count(address) from infoone where(";
foreach (string s in str)
{
if (x == 0)
{
ft += " " + s;
sql += "(address like '%" + ft.Remove(0, 1) + "%')";
sql1 += "(address like ''%" + ft.Remove(0, 1) + "%'')";
}
else
{
ft += " " + s;
sql += " OR (address like '%" + ft.Remove(0, 1) + "%')";//ft.Remove(0, 1)
sql1 += " OR (address like ''%" + ft.Remove(0, 1) + "%'')";//ft.Remove(0, 1)
}
x++;
}
sql += "); if @v>0 begin set @st=@st+'" + sql1 + ")'; end else begin set @st=@st+'" + sql1 + ")'; end execute(@st);";
问题出在下面一行
sql += "); if @v > 0 begin set @st=@st+'" + sql1 + "'+ 'and ('; end else begin set @st=@st+'" + sql1 + "'+ 'or ('; end ";
sql变量@v是这样赋值的,
select @v=count(address) from infoone where address like '%edmonton%'
在上面的行中,@v 应该得到'0',我单独检查了它。但是 if 条件仍然在以下代码中运行(不运行它应该运行的 else 条件)
sql += "); if @v>0 begin set @st=@st+'" + sql1 + ")'+' and ('; end else begin set @st=@st+'" + sql1 + ")'+ 'or ('; end ";
x = 0;
最后生成的查询如下,但再次使用 sql execute(...) 执行查询。并且查询中不包含主sql登录,
declare @v int;set @v=-1;declare @st varchar(1000);
set @st='select PLACEID,LEFT(CONVERT(NVARCHAR(1000),description),500)+''.'' as des1,LOCATIONCITY,ADDRESS,DateT,RENT from infoone where ';
Select @v= count(address) from infoone where((address like '%main%')
OR
(address like '%main street%')
OR (address like '%main street edmonton%'));
if @v > 0 begin set @st=@st+'(address like ''%main%'')
OR (address like ''%main street%'') OR (address like ''%main street edmonton%'')'+
'and ('; end else begin set @st=@st+'(address like ''%main%'') OR (address like ''%main street%'')
OR (address like ''%main street edmonton%'')'+ 'or ('; end ;
Select @v= count(locationcity) from infoone where((locationcity like '%main%')
OR (locationcity like '%street%') OR (locationcity like '%edmonton%') );
if @v>0 begin set @st=@st+'(locationcity like ''%main%'') OR (locationcity like ''%street%'')
OR (locationcity like ''%edmonton%'') )'+' and ('; end else begin set @st=@st+'(locationcity like ''%main%'')
OR (locationcity like ''%street%'') OR (locationcity like ''%edmonton%'') )'+
'or ('; end Select @v= count(address) from infoone where((address like '%main%')
OR (address like '%main street%') OR (address like '%main street edmonton%'));
if @v>0 begin set @st=@st+'(address like ''%main%'') OR (address like ''%main street%'')
OR (address like ''%main street edmonton%''))'; end else begin set @st=@st+'(address like ''%main%'')
OR (address like ''%main street%'') OR (address like ''%main street edmonton%''))'; end execute(@st);
请帮我弄清楚我做错了什么,
谢谢
【问题讨论】:
-
你检查它最后返回了什么吗?我的意思是查询。
-
是的,这就是我说“如果@v > 0”条件为真,即使@v 应该等于0
-
你可以只粘贴查询,即sql语句吗?很难猜测这行或上一行是否有任何语法错误..
-
@Rafay 我已经用查询更新了问题,但最终生成的查询中没有包含很多逻辑
-
我没有看到任何语法错误 .. 尝试在 start 中硬编码 @v 的值以检查流程..
标签: c# sql sql-server-2008 tsql sql-server-2012