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,你直接得到它,如果不是,它将在任何情况下中断。。。