0

我有一个返回 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。

4

2 回答 2

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小提琴

这甚至可以提供创建更合适的表的机会:

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小提琴

如果绝对需要传递逗号分隔列表,您可以使用 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小提琴

于 2013-01-28T18:09:00.047 回答
0

使用charindex()like

where ','+'2342342-________','5435354-________' ,'_______-________'+',' like '%,' + ORG + '-' + ORGSUB + ',%'

如果参数中有空格,则更像是:

where ','+replace(@orglist, ' ', '')+',' like '%,'+ORG+'-'+ORGSUB+',%'
于 2013-01-28T17:11:58.497 回答