以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  表值函数出错  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=99564)

--  作者:happyft
--  发布时间:2017/4/21 14:21:00
--  表值函数出错
CREATE FUNCTION dbo.ufn_yw200
(
@whereflt NVARCHAR(MAX), 
@groupcol NVARCHAR(100)
)

RETURNS TABLE 
AS
RETURN 
(
SE LECT 客户,@groupcol,sum(数量) as 数量 from 订单明细 a inner join 订单 b on a.订单编号 = b.订单编号 and @whereflt 
group by 客户,@groupcol
)
GO

建立带参数的表值函数时提示错误
消息 4145,级别 15,状态 1,过程 ufn_yw200,第 9 行
在应使用条件的上下文(在 \')\' 附近)中指定了非布尔类型的表达式。
同时有变量的地方也提示不对,要怎么写才正确?

谢谢!

--  作者:有点色
--  发布时间:2017/4/21 14:27:00
--  

 不能直接写,你尝试使用exec函数

 

https://www.baidu.com/baidu?wd=EXEC+sqlserver&tn=monline_4_dg&ie=utf-8

 


--  作者:HappyFt
--  发布时间:2017/4/22 10:30:00
--  
改为储存过程,执行命令没有错误
ALTER PROCEDURE [dbo].[usp_yw200]
(@whereflt NVARCHAR(MAX),@groupcol NVARCHAR(100))
AS
BEGIN
    DECLARE @sql NVARCHAR(MAX);
    SET @sql = \'SE LECT 客户 ,\' +@groupcol+ \', sum(数量) as 数量 from 订单明细 a inner join 订单 b on a.订单编号 = b.订单编号\' 
    +@whereflt+ \'group by 客户,\' +@groupcol;
    EXEC sp_executesql @sql;
END;

但输入值测试总出错: 

DECLARE @return_value int
EXEC @return_value = [dbo].[usp_yw200]
@whereflt = N\'订单类别= \'\'客户订单\'\'\',@groupcol = N\'制单日期\'
SELECT \'Return Value\' = @return_value
GO
执行结果是  \'订单类别\' 附近有语法错误。1行受影响是返回了0 ,但没有返回实际的数据,变量值两端都是用两个单引号,写法也没错,问题出在哪里?


--  作者:有点蓝
--  发布时间:2017/4/22 11:11:00
--  
ALTER PROCEDURE [dbo].[usp_yw200]
(@whereflt NVARCHAR(MAX),
@groupcol NVARCHAR(100))
AS
BEGIN
    DECLARE @sql NVARCHAR(MAX);
    SET @sql = \'SELECT 客户 ,\' +@groupcol+ \', sum(数量) as 数量 from 订单明细 a inner join 订单 b on a.订单编号 = b.订单编号\' 
if @whereflt is not null
begin
SET @sql = @sql+ \' where \'+ @whereflt
end
    SET @sql = @sql + \' group by 客户,\' +@groupcol;
    --select @sql
    EXEC sp_executesql @sql;
END;

select @sql看拼凑的真正sql是什么就知道问题在哪

--  作者:HappyFt
--  发布时间:2017/4/22 12:11:00
--  
谢谢老师,按你这样写没有问题,我知道错在哪里了,犯了个低级错误,原来@whereflt里面漏掉了where 这个关键字