我会推荐一个CLR表值函数。代替convert this function来处理整数不应该太多。
然后,你可以说:
SELECT t.Columns
FROM dbo.YourTable AS t
INNER JOIN dbo.CLRFunctionName(@IntegerList) AS f
ON t.ColumnName = f.Item;
对于XML(在你无法实现CLR的情况下),你可以这样做:
CREATE FUNCTION [dbo].[SplitInts]
(
@List VARCHAR(MAX),
@Delimiter CHAR(1)
)
RETURNS TABLE
AS
RETURN (SELECT Item FROM (SELECT Item = x.i.value('(./text())[1]', 'int') FROM
(SELECT [XML] = CONVERT(XML, '<i>' + REPLACE(@List, @Delimiter, '</i><i>')
+ '</i>').query('.')) AS a CROSS APPLY [XML].nodes('i') AS x(i)
) AS y WHERE Item IS NOT NULL
);
GO
,做同样的事情。 ...
SELECT t.Columns
FROM dbo.YourTable AS t
INNER JOIN dbo.SplitInts(@IntegerList) AS f
ON t.ColumnName = f.Item;
在这两种情况下,都不需要临时表或表变量。
在我的工作中,我的老板想要拆分,我想使用XML。我向朋友询问,他说xml更难以检查是否无法正常工作,并且在旧版本的sql server中可能无法正常工作,对拆分字符串更容易。我为你说的先行XML,但我不知道如何与我的朋友辩论 –
证明了这个概念。创建一个读取XML并对其进行操作的过程。该代码将表明它将比解析文本更清洁。你甚至不需要编写C#来做到这一点。只需在T-SQL语句中创建一个示例XML文档即可运行测试。 –
@ElVieejo SQL Server 6.5(大约90年代中后期)是最后一个不支持XML的版本。你真的担心回到那么远吗? –