以文本方式查看主题 - 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))
传入的参数这样
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
|