存储过程简单问题--传递参数

kevin_xu4365 2009-06-16 04:32:35
存储过程不太熟,问个简单问题

sql语句已经太长,并且参数在语句中间。现在就是想加一个条件,判断传入的参数,如果不是0则加上该条件,是0就不加该条件。 很简单,看看大家比较正规的写法。

where (case @year when 0 then 1=1 else [year]=@year end)不对
...全文
49 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hm8030 2009-06-17
  • 打赏
  • 举报
回复
对,用存储过程就简单多啦,建议用存储过程;
kevin_xu4365 2009-06-17
  • 打赏
  • 举报
回复
很感谢大家啊。问题已解决。给出答案吧。
select * from tb where 1=1 and (@id=0 and 1=1 or id=@id)
根据@id判断是不是要加后面的条件。大家可以试下。where后面加上case不行。
szh3210 2009-06-17
  • 打赏
  • 举报
回复
sql server 2000 也没问题
rainsome 2009-06-17
  • 打赏
  • 举报
回复
Sql server 2005下可以用。

[Quote=引用 12 楼 szh3210 的回复:]
use Northwind


declare @Country  int
set @Country =1 --不知道你试了没,这里改 成 0  就是你要的效果

select * from dbo.Customers where

case when @Country=0 then case when Country='uk' then 1  end else 1 end =1
[/Quote]
szh3210 2009-06-17
  • 打赏
  • 举报
回复
如果后面还有其它条件直接 加上就可以了。
szh3210 2009-06-17
  • 打赏
  • 举报
回复
use Northwind


declare @Country int
set @Country =1 --不知道你试了没,这里改 成 0 就是你要的效果

select * from dbo.Customers where

case when @Country=0 then case when Country='uk' then 1 end else 1 end =1
kevin_xu4365 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lchy110 的回复:]
引用 5 楼 kevin_xu4365 的回复:
引用 3 楼 lchy110 的回复:
是存储过程还是SQL语句拼写? 是存储过程就好些了 可以用if啊
create procedure test
@where varchar(100)
as
declare @sqlstr varchar(500)
begin
Set @sqlstr =''
if @where <>''--------判断是否为空
begin
SET @sqlstr= 'select * from tablename where '+@where ---------------不为空则加条件
end
else
begin
SET @sqlstr= '…

[/Quote]

我就是不想把语句拆开再拼起来,不然也不会发帖了。楼上的为什么建议在页面里面写呢?能详细点吗?谢了啊。另外where后面没有case语法吗?
离子漂浮物 2009-06-16
  • 打赏
  • 举报
回复
老实说,这种情况我是非常建议使用asp.net代码来实现拼接。
szh3210 2009-06-16
  • 打赏
  • 举报
回复
where case when @year =0 then case when [year]=@year then 1 end else 1 end =1

Aden 2009-06-16
  • 打赏
  • 举报
回复
where 后面没有case语法;
你把语句分开写就可以了

如下:

if (@year = 0) then
begin
--------
end
else
begin
--------
end



szh3210 2009-06-16
  • 打赏
  • 举报
回复


Northwind



declare @Country int
set @Country =1

select * from dbo.Customers where

case when @Country=0 then case when Country='uk' then 1 end else 1 end =1
lchy110 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kevin_xu4365 的回复:]
引用 3 楼 lchy110 的回复:
是存储过程还是SQL语句拼写?  是存储过程就好些了  可以用if啊
create procedure test
@where varchar(100)
as
declare @sqlstr varchar(500)
begin
Set @sqlstr =''
if @where <>''--------判断是否为空
begin
SET @sqlstr=  'select * from tablename where '+@where ---------------不为空则加条件
end
else
begin
SET @sqlstr=  'select * from tablename '  --------…



就…
[/Quote]
一样的啊 我这只是一个简单的存储过程只是告诉你可以自己动态的去组SQL语句 这个是把SQL语句当成一个string 类型的字符串了 你可以去组合啊 而且上面用了IF判断了 你就好分开了吧
kevin_xu4365 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lchy110 的回复:]
是存储过程还是SQL语句拼写? 是存储过程就好些了 可以用if啊
create procedure test
@where varchar(100)
as
declare @sqlstr varchar(500)
begin
Set @sqlstr =''
if @where <>''--------判断是否为空
begin
SET @sqlstr= 'select * from tablename where '+@where ---------------不为空则加条件
end
else
begin
SET @sqlstr= 'select * from tablename ' --------…
[/Quote]


就是因为不能把sql语句拆开写,这个条件加在中间,要么不加。
lchy110 2009-06-16
  • 打赏
  • 举报
回复
还有要是用SQL 语句拼写 就是去在CS代码里判断条件不就可以了?
StringBuilder sbWhere = new StringBuilder();
//this.ccdate1.Value=DateTime.Now.AddYears(-1).ToString("yyyy-MM-dd");
//this.ccdate2.Value=DateTime.Now.ToString("yyyy-MM-dd");
if(this.ccdate1.Value.Trim()!=""&&this.ccdate2.Value.Trim()!="")
{
sbWhere.AppendFormat(" (firstdate between '{0} 00:00:01' and '{1} 23:59:59') ",this.ccdate1.Value.Trim(),this.ccdate2.Value.Trim());
}
else
{
sbWhere.AppendFormat(" (firstdate between '{0} 00:00:01' and '{1} 23:59:59')",DateTime.Now.AddYears(-1).ToString("yyyy-MM-dd"),DateTime.Now.ToString("yyyy-MM-dd"));
}
string cityvalue=Request["city"].ToString().Trim();
if(cityvalue!="-1")
{
sbWhere.AppendFormat(" and city='{0}' ",cityvalue);
}
if(this.mobtxt.Value.Trim()!="")
{
sbWhere.AppendFormat(" and mobile='{0}'",this.mobtxt.Value.Trim());
}
if(tbusername.Text.Trim()!="")
{
sbWhere.AppendFormat(" and username='{0}'",this.tbusername.Text.Trim());
}
if(jf1txt.Value.Trim()!=""&&this.jf2txt.Value.Trim()!="")
{
try
{
maxjf=Convert.ToInt32(jf2txt.Value.Trim());
minjf=Convert.ToInt32(jf1txt.Value.Trim());
if(maxjf<minjf)
{
RegisterStartupScript("warning","<script>alert('积分值输入不正确!')</script>");
return;
}
}
catch(Exception ex)
{
RegisterStartupScript("warning","<script>alert('积分值输入不正确!')</script>");
return;
}
int fzlx=this.jfddl.SelectedIndex;
if(fzlx==0)
{
sbWhere.AppendFormat(" and ({0}<=jfsum and jfsum<={1}) and ({2}<(jfsum-jfuse) and (jfsum-jfuse)<{3})",minjf,maxjf,minjf,maxjf);
}
if(fzlx==1)
{
sbWhere.AppendFormat("and ({0}<=jfsum and jfsum<={1})",minjf,maxjf);
}
if(fzlx==2)
{
sbWhere.AppendFormat("and ({0}<=(jfsum-jfuse) and (jfsum-jfuse)<={1})",minjf,maxjf);
}
if(fzlx==3)//已用积分
{
sbWhere.AppendFormat("and ({0}<=jfuse and jfuse<={1})",minjf,maxjf);
}
}
string where = sbWhere.ToString();
lchy110 2009-06-16
  • 打赏
  • 举报
回复
是存储过程还是SQL语句拼写? 是存储过程就好些了 可以用if啊
create procedure test
@where varchar(100)
as
declare @sqlstr varchar(500)
begin
Set @sqlstr =''
if @where<>''--------判断是否为空
begin
SET @sqlstr= 'select * from tablename where '+@where ---------------不为空则加条件
end
else
begin
SET @sqlstr= 'select * from tablename ' -----------------为空则不处理
end
exec (@sqlstr)
end
dgq3719091 2009-06-16
  • 打赏
  • 举报
回复
顶上去
kevin_xu4365 2009-06-16
  • 打赏
  • 举报
回复
顶啊顶啊顶啊

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧