我有一个返回5个结果的查询,这是正确的。我现在正在尝试将其重新写入存储过程。
原始查询:
SELECT something FROM myTable where
ORG + '-' + ORGSUB like '2342342-________' or
ORG + '-' + ORGSUB like '5435354-________' or
ORG + '-' + ORGSUB like '_______-________'
但我现在想要将ORG
作为逗号分隔的列表传递,所以它看起来像:
SELECT ORG + '-' + ORGSUB FROM myTable where
ORG + '-' + ORGSUB in('2342342-________','5435354-________' ,'_______-________')
但我在这里得到0个结果。
我也尝试过使用Split功能,如下所示:
ALTER FUNCTION [dbo].[udf_Split]
(
@psCSString VARCHAR(max)
)
RETURNS @otTemp TABLE(sID VARCHAR(50))
AS
BEGIN
DECLARE @sTemp VARCHAR(50)
WHILE LEN(@psCSString) > 0
BEGIN
SET @sTemp = LEFT(@psCSString, ISNULL(NULLIF(CHARINDEX(',', @psCSString) - 1, -1),
LEN(@psCSString)))
SET @psCSString = SUBSTRING(@psCSString,ISNULL(NULLIF(CHARINDEX(',', @psCSString), 0),
LEN(@psCSString)) + 1, LEN(@psCSString))
INSERT INTO @otTemp VALUES (@sTemp)
END
RETURN
END
创建存储过程并在顶部声明所有变量
SELECT something
FROM myTable
where ORG + '-' + ORGSUB in (select * from udf_Split(@orgList) as Split)
但这也给了我一个大胖子。
答案 0 :(得分:1)
我知道这并没有回答实际的问题,但我所看到的所有处理这个问题的解决方案感觉就像是一个肮脏的黑客,可以解决以前无法将多个值传递给过程的限制。自从在sql-server 2008中引入表值参数以来,我没有理由在SQL中需要分隔字符串:
第一步是创建你的类型以包含值(我倾向于使用通用名称,以便可以重用它们):
CREATE TYPE dbo.StringList AS TABLE (Value NVARCHAR(MAX));
然后创建您的程序:
CREATE PROCEDURE dbo.GetFromTable @OrgList dbo.StringList READONLY
AS
SELECT Something
FROM MyTable
WHERE Org + '-' + OrgSub IN (SELECT Value FROM @OrgList);
GO
然后您可以按如下方式调用您的程序
DECLARE @OrgList dbo.StringList;
INSERT @OrgList VALUES
('2342342', '________', 'A'),
('5435354', '________', 'B');
EXECUTE dbo.GetFromTable @OrgList;
<强> SQL Fiddle 强>
这甚至可以让opputunity创建一个更合适的表格:
CREATE TYPE dbo.OrgList AS TABLE(Org VARCHAR(10), OrgSub VARCHAR(10));
CREATE PROCEDURE dbo.GetFromTable @OrgList dbo.OrgList READONLY
AS
SELECT Something
FROM MyTable
WHERE EXISTS
( SELECT 1
FROM @OrgList O
WHERE MyTable.Org = o.Org
AND MyTable.OrgSub = o.OrgSub
);
GO
然后执行
DECLARE @OrgList dbo.OrgList;
INSERT @OrgList VALUES
('2342342', '________'),
('5435354', '________');
EXECUTE dbo.GetFromTable @OrgList;
<强> SQL Fiddle 强>
如果绝对需要传递逗号分隔列表,可以使用XML转换将其转换为StringList类型,并使用相同的过程,但使用表值参数比使用分隔字符串更灵活:
DECLARE @S VARCHAR(MAX) = '2342342-________,5435354-________,_______-________';
DECLARE @OrgList dbo.StringList;
INSERT @OrgList
SELECT Y.value('.', 'NVARCHAR(MAX)')
FROM (SELECT [X] = CAST(('<X>' + REPLACE(@S, ',' ,'</X><X>')+'</X>') AS XML)) X
CROSS APPLY X.nodes('X') AS y (Y)
EXECUTE GetFromTable @OrgList
<强> SQL Fiddle 强>
答案 1 :(得分:0)
使用charindex()
或like
:
where ','+'2342342-________','5435354-________' ,'_______-________'+',' like '%,' + ORG + '-' + ORGSUB + ',%'
如果参数中有空格,那么它更像是:
where ','+replace(@orglist, ' ', '')+',' like '%,'+ORG+'-'+ORGSUB+',%'