Foxtable(狐表)用户栏目专家坐堂 → 表值函数参数过多的问题


  共有2690人关注过本帖树形打印复制链接

主题:表值函数参数过多的问题

帅哥哟,离线,有人找我吗?
happyft
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1938 积分:17793 威望:0 精华:0 注册:2014/7/29 19:09:00
表值函数参数过多的问题  发帖心情 Post By:2018/1/9 22:37:00 [显示全部帖子]

如下的表值函数
CREATE FUNCTION [dbo].[ufn_mps05_1] (@whereflt NVARCHAR(MAX))
RETURNS TABLE
AS RETURN
    SE LECT *
    FROM MPS05_1
    WHERE 产品编码 IN
          (
              SE LECT DISTINCT 产品编码 FROM MPS01_1 WHERE 订单编号 IN ( @whereflt )
          );


当传入的参数值是一个比如  'D-001' 时不会出错,但我想要传的参数的值是多个, 生成类似  订单编号 IN ('D-001','D-002','D-003')  这样的
msgbox显示出来的语句如下
Se lect distinct 产品编码 From ufn_mps05_1('17060201','18010401') where 1 = 1

这样执行会出错,提示  "为过程或函数 ufn_mps05_1 指定了过多的参数"

上面传入参数那里要怎么写才正确?

谢谢!




 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1938 积分:17793 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2018/1/10 8:38:00 [显示全部帖子]

用储存过程动态sql实现的我会,就想问下如果用表值函数怎么实现?

Se lect distinct 产品编码 From ufn_mps05_1('17060201','18010401') where 1 = 1

因为  ufn_mps05_1('17060201','18010401') 传入参数中间用了逗号分隔就变成多个值了.
但我要实现 订单编号 IN ('17060201','18010401') 必须要将 '17060201','18010401' 这多个值组合在一起的条件一次传入
所以不知道怎么写了



 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1938 积分:17793 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2018/1/10 10:09:00 [显示全部帖子]

  Dim tr2 As WinForm.TreeView = e.Form.Controls("Tr_XG")
    Dim fids As String '定义订单节点集合
    For Each nd2 As WinForm.TreeNode In tr2.Nodes  '只遍历订单编号节点
        If nd2.checked = True Then
            fids = fids & ",'" & nd2.name & "'"
        End If
    Next
    If fids > "" Then
        fids = fids.trim(",")
        fids = fids.trim("'")  '将最外面的两个单引号去掉
        sql = "Se lect distinct " & seCols & " From ufn_mps05_11('" & fids & "') where " & Filter
   end if

按上面代码还是不行,请帮忙看下上面代码哪里有问题,谢谢!

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1938 积分:17793 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2018/1/10 19:46:00 [显示全部帖子]

还是不行,上面一种出错,变量变成字符串显示出来了,下面一种没出错,但查不出任何值来,msgbox显示出来是
Se lect distinct 产品编码 From ufn_mps05_1('''1703-14-04’',’'1705-25-01’',’'17060201’',’'18010401'’') where 1 = 1
相当于条件变成 订单编号 in (''1703-14-04’',’'1705-25-01’',’'17060201’',’'18010401'’)  没有符合条件的值了

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1938 积分:17793 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2018/1/10 21:54:00 [显示全部帖子]

Dim tr2 As WinForm.TreeView = e.Form.Controls("Tr_XG")
    Dim fids As String '定义订单节点集合
    For Each nd2 As WinForm.TreeNode In tr2.Nodes  '只遍历订单编号节点
        If nd2.checked = True Then
            fids = fids & ",''" & nd2.name & "''"
        End If
    Next
    If fids > "" Then
        fids = fids.trim(",")
        sql = "Se lect distinct 产品编码 From ufn_mps05_11('" & fids & "')  --后面的条件不用管
   end if

问题是函数的传入参数是上面拼接起来的变动,如红色部份,这里怎么执行起来都不对, 储存过程中拼接动态sql我会,但表值函数中不会,我试下


 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1938 积分:17793 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2018/1/11 9:50:00 [显示全部帖子]

问题找到了,不是代码的问题,而是因为原表中  订单编号  后面多了一串空格 复制出来想这样  1703-14-04                      ,每个订单号都一样

    INSE RT INTO MPS01
    (
        订单编号,
        产品编码,
        计量单位,
        需求数量,
        需求日期,
        产品来源
    )
    SE LECT a.订单编号,
        a.产品编码,
        a.计量单位,
        a.交货日期,
        a.产品来源
    FROM dbo.订单明细 a
        INNER JOIN dbo.订单 b
            ON a.sys_Over = 0
               AND a.订单编号 IS NOT NULL
               AND a.订单编号 = b.订单编号

为什么上面的代码执行后,MPS01的订单编号后面都有一串空格,而产品编码等字段后面又没有空格,
另外用 UPDATE MPS01 SE T 订单编号 = LTRIM(RTRIM(订单编号)) 也不能批量去除空格
只能在查询中se lect时 用LTRIM(RTRIM(订单编号))来实现


    

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1938 积分:17793 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2018/1/11 10:22:00 [显示全部帖子]

果然是这个问题,建立字段时全部都是用nvarchar的,结果此表中的订单编号新建时默认是 nchar(10),只是把长度改了,类型没注意改过来,导致此结果,
真是谢谢老师了

 回到顶部