为了账号安全,请及时绑定邮箱和手机立即绑定

EXEC sp_executesql 语法老是有错误,真的是疯了,不知道如何去改

EXEC sp_executesql 语法老是有错误,真的是疯了,不知道如何去改

偶然的你 2018-12-07 12:04:29
我的SQL代码如下 ALTER procedure [dbo].[frdhdpekg] (@fwhere varchar(800))as --第一步建立一个临时表#re,如果已经存在,就删除,重新建if object_id('tempdb.dbo.#fre') is not null drop table #fre CREATE TABLE #fre   (id int NULL,  cinvcode varchar(50) NULL,  intb float NULL, free1 bit NULL,  free2 bit NULL,  free3 bit NULL, --是否批次管理  sta int NULL,--层次,一定要 pcinvcode varchar(50) NULL)--父编码-- 第二步 定义一个变量DECLARE @Level intSET @Level = 1--第三步,追加查询把订单资料追加到临时表DECLARE @sql NVARCHAR(MAX) SET @sql = 'insert into #fre(a.id,a.cinvcode,a.intb,b.free1,b.free2,free3,pcinvcode,sta)   select b.ID,b.cinvcode,CASE WHEN f.free1=1 THEN b.intb*b.brdint/g.weight     ELSE b.intb*b.brdint END AS quantity,f.free1,f.free2,f.free3,'''',1     from frdrecord a left join frdrecordson b on a.stcode=b.stcode left join Dsale c on    b.stsa=c.socode left join Cmoctb d on b.brpid=d.tbid  left join    Evendor e on a.stlea=e.CodeStr LEFT JOIN Ainventory f on b.cinvcode=f.cInvCode    LEFT JOIN Cbom g ON b.cinvcode=g.cinvcode     where @where' +' order by b.cinvcode '--EXEC sp_executesql @sqlEXECUTE sp_executesql @sql, N'@where NVARCHAR(MAX)', @where = @fwhere out 后面的省略掉------ 我执行语句如下 exec [frdhdpekg]  @fwhere='a.date2 between ''2014-04-10'' and ''2014-05-11'' and  b.cwhcode like ''%K%''' 老是提示如下错误 消息 4145,级别 15,状态 1,第 8 行在应使用条件的上下文(在 'order' 附近)中指定了非布尔类型的表达式。 不知道如何修正我的错误,急死人了,请大家帮忙,非常感谢.
查看完整描述

9 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

我觉得应该是“@where=@fwhere out”这里有错,把后面的out去掉试一试。

查看完整回答
反对 回复 2019-01-07
?
倚天杖

TA贡献1828条经验 获得超3个赞

去掉了也是一样,我刚才试了一下

查看完整回答
反对 回复 2019-01-07
?
慕斯709654

TA贡献1840条经验 获得超5个赞

打开Profiler,看一下实际执行的语句。

查看完整回答
反对 回复 2019-01-07
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

一步步print ,看输出,执行到哪一步错了....

查看完整回答
反对 回复 2019-01-07
?
米脂

TA贡献1836条经验 获得超3个赞

这个语句明显写的有问题啊 where @where' +' order by b.cinvcode ' 变量怎么能这么写 把这里改掉应该就行了

查看完整回答
反对 回复 2019-01-07
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

我是 EXECUTE sp_executesql @sql, N'@where NVARCHAR(MAX)', @where = @fwhere out 这样子执行的.

查看完整回答
反对 回复 2019-01-07
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

不太建议动态拼SQL,前面要是没过滤好漏进来东西你就麻烦了。别太相信前段,可以伪造请求的。

exec [frdhdpekg]   @fwhere=' ; drop table frdrecord --'

ps:最简单的办法把这句语句print出来看看

查看完整回答
反对 回复 2019-01-07
?
慕慕森

TA贡献1856条经验 获得超17个赞

where @where' +' order by b.cinvcode '

改成

where ' + @where +' order by b.cinvcode '

查看完整回答
反对 回复 2019-01-07
  • 9 回答
  • 0 关注
  • 629 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信