Этот код будет анализировать строку через запятую, а затем разбивать результат в зависимости от положения канала:
SET NOCOUNT ON
DECLARE
@keyPair VARCHAR(1000),
@myEmpID VARCHAR(1000),
@myProductID VARCHAR(1000)
DECLARE @myKeyIDs VARCHAR(1000)
SET @myKeyIDs = '2232|33,4555|111,43343|65'
DECLARE
@len INT,
@pos INT,
@found INT
SELECT
@len = LEN(@myKeyIDs),
@pos = 1
SET @myKeyIDs = @myKeyIDs + ','
/* Find the first instance of a comma */
SET @found = CHARINDEX(',', @myKeyIDs, @pos)
WHILE @found > 0
BEGIN
/* The key pair starts at the @pos position and goes */
/* to the @found position minus the @pos position */
SET @keyPair= SUBSTRING(@myKeyIDs, @pos, @found - (@pos))
/* Double-check that pipe exists to avoid failure */
/* If no pipe exists, assume value is myEmpID */
IF CHARINDEX('|',@keyPair) = 0
BEGIN
SET @myEmpID = NULLIF(@keyPair, '')
SET @myProductID = NULL
END
ELSE
BEGIN
/* myEmpID is everything left of the pipe */
/* myProductID is everything on the right */
SET @myEmpID = NULLIF(SUBSTRING(@keyPair, 1,
CHARINDEX('|', @keyPair) - 1), '')
SET @myProductID = NULLIF(SUBSTRING(@keyPair,
CHARINDEX('|', @keyPair) + 1, LEN(@keyPair) - 1), '')
END
/*
INSERT EmployeeOrderLinkend(EmpId,OrderId,ProductId)
VALUES(@myEmpID,@OrderIdPassedAsParamInSP, @myProductId)
*/
SELECT @myEmpID AS myEmpID, @myProductID AS myProductID
/* Move to the next position and search again */
SET @pos = @found + 1
SET @found = CHARINDEX(',', @myKeyIDs, @pos)
END
Одной из проблем при разборе строки является попытка обработать все крайние случаи.Вы должны подготовиться к таким вещам, как пропущенные запятые, пропущенные каналы, слишком большое количество каналов, подтверждение числовых значений и т. Д.Мы также перешли на использование табличных параметров, когда это возможно ...