SQL语句问题动态拼接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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语句问题动态拼接的主要内容,如果未能解决你的问题,请参考以下文章

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

动态执行SQL语句,拼接字符串,select中带有一个变量

Mybatis的动态sql拼接语句

动态拼接SQL 语句

Oracle [存储过程] 执行动态拼接SQL语句并返回结果??

动态拼接SQL语句