我會推薦一個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的版本。你真的擔心回到那麼遠嗎? –