Sql 多个逗号取消限制的参数

Sql 多个逗号取消限制的参数,sql,sql-server,xml,sql-server-2012,Sql,Sql Server,Xml,Sql Server 2012,使用代码作为基础,我可以使用此示例作为和,用于多个条件,使用多个内部联接: Declare @Ids varchar(50) Set @Ids = '1,2,3,5,4,6,7,98,234' declare @Levels varchar(50) set @levels='0,3' declare @XMLLevels XML SET @XMLLevels = CAST('<i>' + REPLACE(@Levels, ',', '</i><i>') +

使用代码作为基础,我可以使用此示例作为和,用于多个条件,使用多个内部联接:

Declare @Ids varchar(50)
Set @Ids = '1,2,3,5,4,6,7,98,234'

declare @Levels varchar(50)
set @levels='0,3'

declare @XMLLevels XML
SET @XMLLevels = CAST('<i>' + REPLACE(@Levels, ',', '</i><i>') + '</i>' AS XML)

DECLARE @XML XML
SET @XML = CAST('<i>' + REPLACE(@Ids, ',', '</i><i>') + '</i>' AS XML)

SELECT a.* 
FROM
    [AdventureWorks2012].[HumanResources].[Employee] a
    INNER JOIN @XML.nodes('i') x(i) 
        ON  a.[BusinessEntityID] = x.i.value('.', 'VARCHAR(MAX)')
    INNER JOIN @XMLlevels.nodes('i') y(i) 
        ON  a.[OrganizationLevel] = y.i.value('.', 'VARCHAR(MAX)')
我似乎无法确定一个OR函数需要什么联接

Declare   @Ids varchar(50)    = '1,2,3,5,4,6,7,98,234'
        , @Levels varchar(50) = '0,3';

SELECT  a.* 
FROM    [AdventureWorks2012].[HumanResources].[Employee] a
Where a.[BusinessEntityID]  
            IN (
                SELECT  CAST(RTRIM(LTRIM(Split.a.value('.', 'VARCHAR(100)'))) AS INT) IDs
                FROM (
                        SELECT Cast ('<X>' 
                                    + Replace(@Ids, ',', '</X><X>') 
                                    + '</X>' AS XML) AS Data
                        ) AS t CROSS APPLY Data.nodes ('/X') AS Split(a) 
                    )
OR a.[OrganizationLevel]   --<-- You can "OR" or "AND" here 
            IN  (
            SELECT CAST(RTRIM(LTRIM(Split.a.value('.', 'VARCHAR(100)'))) AS INT) [Levels]
                 FROM (
                        SELECT Cast ('<X>' 
                                    + Replace(@levels, ',', '</X><X>') 
                                    + '</X>' AS XML) AS Data
                        ) AS t CROSS APPLY Data.nodes ('/X') AS Split(a) 
                    )

不要在sql中使用逗号分隔的字符串。不要去那里。我是认真的。如果必须的话,使用杰夫·摩登的拆分器。@ZoharPeled,我别无选择。这就是事情被传递到日常生活中的方式。我只需要充分利用它,因为有10个以上的项目用于切片,一个存储过程让它无休止地运行。我写道,使用Jeff Moden的拆分器。这是一个超级快速的回答,我这边的回答是+1。使用Split.a.value'text[1],'int'而不使用强制转换和修剪可能更容易。如果这是一个int,你直接得到它,如果不是,它将在任何情况下中断。。。