Разделение разделенной строки на 2 значения .SQL Server 2008.Вы можете помочь? - PullRequest
2 голосов
/ 08 июля 2010

Я передаю строку с разделителями в хранимую процедуру, которая состоит из empId | ProductId + запятая в качестве разделителя с целью заполнения таблицы ссылок.использование SQL Server 2008

     EmployeeOrderLink  Table to be filled
     EmpId
     OrderId
     ProductId

Пример возможного ключа

     MyKeyIds="EmpId|ProductId,
     EG 2232|33,4555|111,43343|65 etc...

Как пройти цикл по строке, разбить ее и вставить в таблицу, например,

   while MyKeyIds  ???
   Logic --PLEASE NOTE THAT EACH KEY IS COMPOSED BY 2 VALUES 
 AND SEPARATED BY THE COMMA.DELIMETER IS USED TO SEPARATE THE INNER VALUES OF THE KEY

         @myEmpID=--Get EmpId from split string
         @myProductId =Get productId from split string

         INSERT EmployeeOrderLinkend(EmpId,OrderId,ProductId)
         VALUES(@myEmpID,@OrderIdPassedAsParamInSP, @myProductId)
    END

Любое предложение о том, как разделить вышеупомянутый ключ и извлечь соответствующие значения?Большое спасибо

Ответы [ 4 ]

2 голосов
/ 08 июля 2010

Здесь - пример функции разделения в SQL.Еще один учебник это .Используя его, я думаю, что я бы сделал ниже, чтобы разделить запятую.Затем вам нужно будет добавить код для разделения на |.

1 голос
/ 08 июля 2010

Этот код будет анализировать строку через запятую, а затем разбивать результат в зависимости от положения канала:

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

Одной из проблем при разборе строки является попытка обработать все крайние случаи.Вы должны подготовиться к таким вещам, как пропущенные запятые, пропущенные каналы, слишком большое количество каналов, подтверждение числовых значений и т. Д.Мы также перешли на использование табличных параметров, когда это возможно ...

0 голосов
/ 08 июля 2010

Начиная с SQL Server 2008, вы можете использовать Табличные параметры , чтобы полностью избежать этой проблемы.

Если вы вызываете сохраненный процесс из ADO.NET , эта ссылка может быть полезна.

0 голосов
/ 08 июля 2010

Другая функция SQL split . По сути, функция split () создаст таблицу из вашего списка с разделителями. Затем вы можете присоединиться к этой таблице, как если бы это была «настоящая» таблица.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...