以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  表值函数参数过多的问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=113141)

--  作者:happyft
--  发布时间: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 指定了过多的参数"

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

谢谢!




--  作者:有点蓝
--  发布时间:2018/1/9 22:50:00
--  
需要使用动态执行sql方法EXEC sp_executesql


--  作者:HappyFt
--  发布时间: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\' 这多个值组合在一起的条件一次传入
所以不知道怎么写了



--  作者:有点甜
--  发布时间:2018/1/10 8:47:00
--  
传入的时候,把单引号去掉即可。在你的函数里面,再给参数加上单引号,才行的。
--  作者:有点甜
--  发布时间:2018/1/10 8:48:00
--  

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

 

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


--  作者:HappyFt
--  发布时间: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

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

--  作者:有点甜
--  发布时间: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
--  发布时间: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\'’)  没有符合条件的值了

--  作者:有点甜
--  发布时间: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


--  作者:有点甜
--  发布时间:2018/1/10 21:08:00
--  

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