首页新闻找找看学习计划

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

0
悬赏园豆:10 [已解决问题] 解决于 2015-07-08 13:31

我的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 int
SET @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 @sql
EXECUTE 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' 附近)中指定了非布尔类型的表达式。

不知道如何修正我的错误,急死人了,请大家帮忙,非常感谢.

zhengyingcan的主页 zhengyingcan | 初学一级 | 园豆:12
提问于:2014-05-11 16:45
< >
分享
最佳答案
0

哪有这么麻烦?

create procedure [dbo].[frdhdpekg] (@fwhere varchar(800))
as
--第一步建立一个临时表#re,如果已经存在,就删除,重新建
-- 第二步 定义一个变量
DECLARE @Level int
SET @Level = 1
--第三步,追加查询把订单资料追加到临时表
DECLARE @sql NVARCHAR(MAX)
 SET @sql = 'select * from sys.databases
   where '+@fwhere+' order by 1 '
EXEC (@sql)

后面的省略掉------

我执行语句如下

exec [frdhdpekg]  @fwhere=' name like ''t%'''

收获园豆:10
我是大菠萝 | 菜鸟二级 |园豆:365 | 2014-05-16 18:14
其他回答(6)
0

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

如远行客 | 园豆:234 (菜鸟二级) | 2014-05-11 20:33

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

支持(0) 反对(0) zhengyingcan | 园豆:12 (初学一级) | 2014-05-12 07:37
0

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

邀月 | 园豆:25327 (高人七级) | 2014-05-12 09:14
0

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

Snail的梦 | 园豆:278 (菜鸟二级) | 2014-05-12 09:40
0

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

Echo丶 | 园豆:211 (菜鸟二级) | 2014-05-14 16:20

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

支持(0) 反对(0) zhengyingcan | 园豆:12 (初学一级) | 2014-05-14 16:22
0

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

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

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

john_masen | 园豆:204 (菜鸟二级) | 2014-05-24 00:49
0

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

改成

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

alixingxing | 园豆:133 (初学一级) | 2014-05-31 19:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册