在多个条件查询时候,怎么动态生成sql语句啊?

时间:2021-06-11 09:05:54
哪位大虾,有例子什么的可以发来看看吗?,先感谢了!

16 个解决方案

#1


creat proc P_test 
(
  @a varchar[10]
)
as
if @a='1'
@str='select * from aaa'
if @a='2'
@str='select * from bbb'
exec @str
go
手写没测试

#2


creat proc P_test 
(
  @a varchar[10]
)
as
declare @str varchar 2000
if @a='1'
@str='select * from aaa'
if @a='2'
@str='select * from bbb'
exec @str
go
手写没测试

#3


恕本人愚昧,如果有几拾个条件的话,是不是要列出它的组合出来?这样还是有点烦啊,

#4


if (Input.GetCondition("身份证").ToString()!="")
{
SearchSQL.Append(" (fIdentityNo like '"+Input.GetCondition("身份证").ToString()+"%') and ");
}
if(Input.GetCondition("姓名").ToString()!="")
{
SearchSQL.Append(" (fName = '"+Input.GetCondition("姓名").ToString()+"') and ");
}
if(Input.GetCondition("性别").ToString()!="-")
{
SearchSQL.Append(" (fGender='"+Input.GetCondition("性别").ToString()+"') and ");
}
if(Input.GetCondition("户口性质").ToString()!="-")
{
SearchSQL.Append(" (FHKKind='"+Input.GetCondition("户口性质").ToString()+"') and ");
}
if(Input.GetCondition("户口号").ToString()!="")
{
SearchSQL.Append(" (fHKNo='"+Input.GetCondition("户口号").ToString()+"') and ");
}
SearchSQL.Remove(SearchSQL.Length-5,4);

#5


这么说吧
你只要拼出你需要的Sql语句就可以了
另拼接过程中要考虑对Sql注入的防范

#6


在写同样的问题
一个表里
几百个列字段
目前想到的只能写个函数
用户选择哪个 然后 触发
就在string后面添加

至于之间的与或条件 想想都恐怖

#7


单个表问题不大,写个类分析字段,再加上用户控件可以解决,只是针对原本就是SQL语句的查询就麻烦了,因为会有嵌入表,group by之类的,那个才叫恐怖。

#8



偶得几百个字段是分布在好几个表中
不然冗余太多
其中还夹杂着条件查询等等
已经想了好几天了
只写出来了一点点
有的可以用access生成语句
生成的语句不好玩

#9


假设三个查询条件:姓名Name,出生日期Birth和年龄Age在三个文本框中。
string strSql = "";
strSql = "SELECT 字段名 FROM 表名 WHERE 1=1"
if(this.txtName.Text != "")
{
   strSql += " AND Name='" + this.txtName.Text + "'";
}
if(this.txtBirth.Text != "")
{
   strSql += " AND Birth='" +  this.txtBirth.Text + "'";
}
if(this.txtAge.Text != "")
{
   strSql += " AND Age=" + this.txtAge.Text;
}
... ...
依次类推了。可以使用StringBuild来构造Sql语句

#10


在这里附上我的一个存储过程疑问:

需求:从TableA中查询数据,查询条件可能包括int column [IC}, varchar column [VC}, datetime column [DC}, 完整应用3个查询条件参数的查询SQL如下:

select * from TableA where IC>@IC and (VC like @VC) and DC>@DC

如果一次应用3个条件,则存储过程很容易写,
Create procdure SA
@IC int,
@VC varchar(50),
@DC datetime
AS
  select * from TableA where IC>@IC and (VC like @VC) and DC>@DC
GO
就行了。

但现在的要求是用户可能忽略其中的1个或2个条件,只输入另外2个或1个条件,未输入的条件有一个标记值(如@IC为-1),存储过程需要根据这些标记值忽略掉这些条件,动态生成SQL然后执行,示意如下(仅考虑可能忽略@IC的情况):
Create procdure SA
@IC int,
@VC varchar(50),
@DC datetime
AS
  declare @SQL varchar(1000)
  set @SQL= 'select * from TableA where (VC like @VC) and DC>@DC'
  if @IC>-1 set @SQL=@SQL+' and IC>@IC'
  exec (@SQL)  
GO

这样写逻辑上应该可以看得懂,但是执行的时候总是提示“必须声明变量@VC, @DC, @ IC"。 是不是最后一句EXEC (@SQL)的时候,不能自动把存储过程中变量@VC, @DC, @ IC的值代入@SQL代表的SQL命令中?如果是这样,那该怎么写这个存储过程呢?

不要建议我把参数值直接一个个转换成字符串加入到动态SQL变量中然后执行的办法,我不想遭到SQL Inject。

#11


上面 keanu1978(黄金安魂曲) 的办法,摆明了要让人搞SQL Inject

#12


举个例子,如果this.txtName.Text的内容是

' GO DELETE FROM [表名] GO --

你说会怎么样?

#13


我统一 keanu1978(黄金安魂曲) 的 方法

#14


我最终的结论是不应该这样动态拼串然后执行,这样的话根本利用不了存储过程预编译的优势,应该声明一个table类型的本地变量,首先选择全部数据,然后根据条件一环套一环的选择,直到全部参数遍历结束,返回这个table变量的内容。这样速度最快。显然数据量太大的时候也要小心……

#15


uffeng(阿呆) ( ) 信誉:100  2004-07-18 09:36:00  得分: 0  
 
 
   我统一 keanu1978(黄金安魂曲) 的 方法
  
 

#16


进程怎么调用呀
我一点都不会!!!!

#1


creat proc P_test 
(
  @a varchar[10]
)
as
if @a='1'
@str='select * from aaa'
if @a='2'
@str='select * from bbb'
exec @str
go
手写没测试

#2


creat proc P_test 
(
  @a varchar[10]
)
as
declare @str varchar 2000
if @a='1'
@str='select * from aaa'
if @a='2'
@str='select * from bbb'
exec @str
go
手写没测试

#3


恕本人愚昧,如果有几拾个条件的话,是不是要列出它的组合出来?这样还是有点烦啊,

#4


if (Input.GetCondition("身份证").ToString()!="")
{
SearchSQL.Append(" (fIdentityNo like '"+Input.GetCondition("身份证").ToString()+"%') and ");
}
if(Input.GetCondition("姓名").ToString()!="")
{
SearchSQL.Append(" (fName = '"+Input.GetCondition("姓名").ToString()+"') and ");
}
if(Input.GetCondition("性别").ToString()!="-")
{
SearchSQL.Append(" (fGender='"+Input.GetCondition("性别").ToString()+"') and ");
}
if(Input.GetCondition("户口性质").ToString()!="-")
{
SearchSQL.Append(" (FHKKind='"+Input.GetCondition("户口性质").ToString()+"') and ");
}
if(Input.GetCondition("户口号").ToString()!="")
{
SearchSQL.Append(" (fHKNo='"+Input.GetCondition("户口号").ToString()+"') and ");
}
SearchSQL.Remove(SearchSQL.Length-5,4);

#5


这么说吧
你只要拼出你需要的Sql语句就可以了
另拼接过程中要考虑对Sql注入的防范

#6


在写同样的问题
一个表里
几百个列字段
目前想到的只能写个函数
用户选择哪个 然后 触发
就在string后面添加

至于之间的与或条件 想想都恐怖

#7


单个表问题不大,写个类分析字段,再加上用户控件可以解决,只是针对原本就是SQL语句的查询就麻烦了,因为会有嵌入表,group by之类的,那个才叫恐怖。

#8



偶得几百个字段是分布在好几个表中
不然冗余太多
其中还夹杂着条件查询等等
已经想了好几天了
只写出来了一点点
有的可以用access生成语句
生成的语句不好玩

#9


假设三个查询条件:姓名Name,出生日期Birth和年龄Age在三个文本框中。
string strSql = "";
strSql = "SELECT 字段名 FROM 表名 WHERE 1=1"
if(this.txtName.Text != "")
{
   strSql += " AND Name='" + this.txtName.Text + "'";
}
if(this.txtBirth.Text != "")
{
   strSql += " AND Birth='" +  this.txtBirth.Text + "'";
}
if(this.txtAge.Text != "")
{
   strSql += " AND Age=" + this.txtAge.Text;
}
... ...
依次类推了。可以使用StringBuild来构造Sql语句

#10


在这里附上我的一个存储过程疑问:

需求:从TableA中查询数据,查询条件可能包括int column [IC}, varchar column [VC}, datetime column [DC}, 完整应用3个查询条件参数的查询SQL如下:

select * from TableA where IC>@IC and (VC like @VC) and DC>@DC

如果一次应用3个条件,则存储过程很容易写,
Create procdure SA
@IC int,
@VC varchar(50),
@DC datetime
AS
  select * from TableA where IC>@IC and (VC like @VC) and DC>@DC
GO
就行了。

但现在的要求是用户可能忽略其中的1个或2个条件,只输入另外2个或1个条件,未输入的条件有一个标记值(如@IC为-1),存储过程需要根据这些标记值忽略掉这些条件,动态生成SQL然后执行,示意如下(仅考虑可能忽略@IC的情况):
Create procdure SA
@IC int,
@VC varchar(50),
@DC datetime
AS
  declare @SQL varchar(1000)
  set @SQL= 'select * from TableA where (VC like @VC) and DC>@DC'
  if @IC>-1 set @SQL=@SQL+' and IC>@IC'
  exec (@SQL)  
GO

这样写逻辑上应该可以看得懂,但是执行的时候总是提示“必须声明变量@VC, @DC, @ IC"。 是不是最后一句EXEC (@SQL)的时候,不能自动把存储过程中变量@VC, @DC, @ IC的值代入@SQL代表的SQL命令中?如果是这样,那该怎么写这个存储过程呢?

不要建议我把参数值直接一个个转换成字符串加入到动态SQL变量中然后执行的办法,我不想遭到SQL Inject。

#11


上面 keanu1978(黄金安魂曲) 的办法,摆明了要让人搞SQL Inject

#12


举个例子,如果this.txtName.Text的内容是

' GO DELETE FROM [表名] GO --

你说会怎么样?

#13


我统一 keanu1978(黄金安魂曲) 的 方法

#14


我最终的结论是不应该这样动态拼串然后执行,这样的话根本利用不了存储过程预编译的优势,应该声明一个table类型的本地变量,首先选择全部数据,然后根据条件一环套一环的选择,直到全部参数遍历结束,返回这个table变量的内容。这样速度最快。显然数据量太大的时候也要小心……

#15


uffeng(阿呆) ( ) 信誉:100  2004-07-18 09:36:00  得分: 0  
 
 
   我统一 keanu1978(黄金安魂曲) 的 方法
  
 

#16


进程怎么调用呀
我一点都不会!!!!