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


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

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

帅哥哟,离线,有人找我吗?
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 指定了过多的参数"

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

谢谢!




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


加好友 发短信
等级:超级版主 帖子:112380 积分:572162 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/1/9 22:50:00 [只看该作者]

需要使用动态执行sql方法EXEC sp_executesql


 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | 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' 这多个值组合在一起的条件一次传入
所以不知道怎么写了



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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/1/10 8:47:00 [只看该作者]

传入的时候,把单引号去掉即可。在你的函数里面,再给参数加上单引号,才行的。

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/1/10 8:48:00 [只看该作者]

不然,就换成两个单引号,如

 

'''17060201'',''18010401'''


 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | 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

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

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/1/10 10:12: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 " & seCols & " From ufn_mps05_11('" & fids & "') where " & Filter
   end if
 
------------------或者
 
  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 " & seCols & " From ufn_mps05_11('" & fids & "') where " & Filter
   end if

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | 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'’)  没有符合条件的值了

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/1/10 21:07:00 [只看该作者]

你函数要改的啊

 

CREATE FUNCTION test0 (@whereflt NVARCHAR(MAX))
RETURNS TABLE
AS RETURN
    SELECT *
    FROM table_1
    WHERE 产品编码 IN
          (
              SELECT DISTINCT 产品编码 FROM table_1 WHERE ',' + @whereflt + ',' like ',%' + 产品编码 + '%,'
          );

 

传入的参数这样

 

Select distinct 产品编码 From test0('123,abc') where 1 = 1


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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/1/10 21:08:00 [只看该作者]

如果你确实要用in,那你就要用exec处理,如 http://blog.csdn.net/make1828/article/details/39498197

 


 回到顶部
总数 15 1 2 下一页