【发布时间】:2018-08-10 16:14:57
【问题描述】:
我的基本程序基本上如下所示:
create procedure zsp_selectallupceans_list
(@UPCList nvarchar(4000),
@EANList nvarchar(4000))
as
select *
from data as dd
where dd.UPC in (--myUPC list) or dd.EAN in (--myEAN list)
这是基本思想。现在我需要以某种方式拆分我从 C# 应用程序传递的这个字符串,它看起来像 UPC 和 EAN 列表:
where dd.UPC in ('123','456','567') or dd.EAN in('1234','5542','412')
从 C# 应用程序传递的 UPCList 参数如下所示:
'123,456,567' and eanlist: '1234,5542,412'
我找到了一个看起来像这样的方法:
CREATE FUNCTION dbo.splitstring
(@stringToSplit VARCHAR(MAX))
RETURNS
@returnList TABLE ([Name] [NVARCHAR](500))
AS
BEGIN
DECLARE @name NVARCHAR(255)
DECLARE @pos INT
WHILE CHARINDEX(',', @stringToSplit) > 0
BEGIN
SELECT @pos = CHARINDEX(',', @stringToSplit)
SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)
INSERT INTO @returnList
SELECT @name
SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
END
INSERT INTO @returnList
SELECT @stringToSplit
RETURN
END
这个函数的用法如下:
SELECT * FROM dbo.splitstring('91,12,65,78,56,789')
输出是这些数字,它们被拆分并作为结果输出。
现在我只需要以某种方式将所有这些组合起来,以便我可以根据传递的参数 UPCList 和 EANList 形成正确的 where 语句
有人可以帮我解决这个问题吗?
【问题讨论】:
-
从 C# 中,您可以将 DataTable 用作传递给 SP 的表值参数:docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/… - 然后您可以在 SP 中拥有一个 @tablevariable,您可以使用 IN() 加入或子查询。
-
我添加了一个额外的答案,其中包含 2 条性能改进建议。
标签: c# asp.net sql-server stored-procedures split