sql语句拼接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql语句拼接相关的知识,希望对你有一定的参考价值。

SQL语句的拼接是什么意思 要有例子

sql语句拼接主要操作于有条件的的增加,删除,修改或查询,下面给你介绍一个条件查询的例子:
既然是拼接sql语句长度不一定,用StringBuffer修饰,而不用String
String name=request.getParameter("name");
String address=request.getParemeter("address");
StringBuffer sql = new StringBuffer();
sql.append("select * from Tuser as t where 1=1");
if(name!=null||!"".equals(name))
sql.append(" and t.name like'%"+name+"%'");

if(address!=null||!"".equals(address))
sql.append(" and t.address like'%"+address+"%'");

以上就是拼接sql语句,也就是说select * from Tuser as t where 1=1一定会执行,而后面两个会根据用户数据参数选择执行
我可是手写的啊,没有复制,明白了吗?不明了再问我,明白了就给分吧,嘿嘿
参考技术A 在多种可变的查询条件下就需要SQL拼接了,比如
StringBuffer sql;
sql=new StringBuffer("SELECT * FROM 表名");
sql.append(" WHERE ");
if(条件1) sql.append(" 字段1='"+条件1+"' AND ");//字段和条件可以自己随意设定
if(条件2) sql.append(" 字段2='"+条件2+"' AND ");//
String finalSQL=sql.toString();
System.out.println(finalSQL);
System.out.println("最后AND位置 "+finalSQL.lastIndexOf(" AND "));
//因为AND拼在每一句最后面,所以有条件成立就肯定有AND 因此要去掉最有一个AND 否则没有AND的情况肯定是 没有任何条件成立 where也可以不要了
finalSQL=finalSQL.substring(0,finalSQL.lastIndexOf(" AND ")>0? finalSQL.lastIndexOf(" AND "):finalSQL.indexOf("WHERE"));
System.out.println(finalSQL);

*注:sql.append(" WHERE "); 就相当于 sql = sql + "where"
参考技术B SQL拼接表名称
declare @sql nvarchar(200)
declare @tablename nvarchar(200)
set @tablename = 't_test'
set @sql = 'select * from ' + @tablename
exec (@sql)
参考技术C 什么意思? 参考技术D 哥们看来你不是认真的 这说的也太 模糊了吧!!!

SQL语句问题动态拼接

SET @sql=N'
WITH T AS (select
ROW_NUMBER() OVER ( ORDER BY poten.CreateTime DESC) AS Row,
poten.AnalysisId,
poten.ProjectCode,
pro.ProjectName,
sysin.IndustryName,
poten.Status
from
ProProject as pro,
SysIndustry as sysin,
PotentialAnalysis as poten WITH ( NOLOCK )
where pro.ProjectCode=poten.ProjectCode
and poten.Remark=sysin.IndustryCode
and 1=1
and poten.Status not in(N''DEL'')
and pro.ProjectName like''%''+'''+@ProjectName+'''+''%''
AND poten.Status like ''%''+'''+@Status+'''+''%''
)
SELECT AnalysisId,
ProjectCode ,
ProjectName ,
IndustryName ,
Status
FROM T
WHERE Row BETWEEN '+@StartIndex+' AND '+@EndIndex+'
SELECT '+@TotalItems+'= COUNT(0)
FROM dbo.PotentialAnalysis as poten,SysIndustry as sysin,ProProject AS pro WITH ( NOLOCK )
WHERE 1=1 and pro.ProjectCode=poten.ProjectCode
and poten.Remark=sysin.IndustryCode
and 1=1
and poten.Status not in(N''DEL'')
and pro.ProjectName like''%''+'''+@ProjectName+'''+''%''
AND poten.Status like ''%''+'''+@Status+'''+''%'''
存储过程中运行告诉我将varchar转换为int出现错误,这个sql动态拼接的不对,到底是哪里有问题

请注意一点:
sql中,变量相加,如果其中有一个变量的数据类型是数字型,那么sql会自动把其他的变量转换为数字型,然后相加。
通过你的错误原因,可以看出,你的代码中,应该是 @StartIndex 和 @EndIndex 这两个变量的数据类型是 int型。

修改方式:
把 @StartIndex 和 @EndIndex 分别改成: Cast(@StartIndex as varchar(10)) 和 Cast(@EndIndex as varchar(10))
如果还有其他变量是int型,也参照上边的方式,强制转换为字符型就OK了。追问

sql可以正常执行了,但是内部数据还是查不到,我在最后有一个@TotalItems的输出参数,这个取不到值还是NULL

追答

动态sql中不支持使用参数,也就是说类似:
declare @item varchar(20),@sql varchar(1000)
set @sql='select @item=count(*) from sysobjects'
exec(@sql)
这段代码是无法执行的。

且你的组装sql的写法中没有这个@TotalItems参数,而是把@TotalItems参数的值传递给了组装语句。

追问

如果我最后执行用这个sp_executesql是可以支持的吧?而且我最后在执行之前加入print @sql 这个@sql没有任何值,是否是其中拼接还是有问题

追答

你是使用什么数据库?

追问

sqlserver2012

追答

恩,那是可以的,但是需要打印的参数必须显式标注在sp_executesql 中

需要修改你的select语句为:SELECT @TotalItems = COUNT(0) FROM ...(后面的我就不多写了),
并且 @TotalItems 变量不需要定义在 @sql 赋值语句之前。

参考技术A like '''% + @ProjectName + '%''
like附近是不是应该这样?追问

不对,不是这的原因,我这么写的间接就等于like '%%'只不过我是拆分成 '%'+''+'%'这个样子了

追答

可以按照下面说的把sql print出来看看

追问

按照楼上的,我把强制转换之后,可以正确编译下去,执行查不到数据,NULL @sql也是空白

参考技术B 你把 @sql print 出来看看不就好找错误了嘛

print @sql

以上是关于sql语句拼接的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的sql语句如何将一列数据拼接成一个字符串?

java动态拼接sql语句并且执行时给sql语句的参数赋值

sql语句加参数

sql语句拼接字段后再模糊查询如何写啊?

关于拼接SQL语句sqlMap的使用方法

sql语句查询结果如何大写?结果如何拼接啊?