Вставить оператор с неизвестным количеством значений, извлеченных из строки - PullRequest
1 голос
/ 10 октября 2010

У меня есть хранимая процедура в SQL Server 2008 дБ.
Эта хранимая процедура принимает параметр, представляющий собой список из 5 целочисленных значений, разделенных запятыми. Эта строка передается через php-скрипт и форматируется так:

01,02,03,14,15

Эти значения должны идти в этой таблице:

Id | Type id
-------------
1 | 1
1 | 2
1 | 3
1 | 14
1 | 15

... где идентификатор одинаковый, а идентификатор типа - одно из значений, разделенных запятыми.

Очевидно, у меня может быть строка типа "01,02,03" только с 3 значениями. Поэтому мне нужен способ вставить только 3 строки в таблицу выше, в результате чего:

Id | Type id
-------------
1 | 1
1 | 2
1 | 3

Я мог бы изменить либо скрипт php, либо хранимую процедуру, поэтому я открыт для любых предложений.

Ответы [ 3 ]

1 голос
/ 10 октября 2010

Вы можете создать функцию, которая поможет вам сделать это.

CREATE FUNCTION dbo.Split(@origString varchar(max), @Delimiter char(1))     
returns @temptable TABLE (items varchar(max))     
as     
begin     
    declare @idx int     
    declare @split varchar(max)     

    select @idx = 1     
        if len(@origString )<1 or @origString is null  return     

    while @idx!= 0     
    begin     
        set @idx = charindex(@Delimiter,@origString)     
        if @idx!=0     
            set @split= left(@origString,@idx - 1)     
        else     
            set @split= @origString

        if(len(@split)>0)
            insert into @temptable(Items) values(@split)     

        set @origString= right(@origString,len(@origString) - @idx)     
        if len(@origString) = 0 break     
    end 
return     
end

Затем вы можете вызвать эту функцию, чтобы разделить значения параметров:

Не уверен на 100%, откуда берется значение идентификатора, поэтому я объявил переменную.

Declare @newId int
Set @newId = 1

Insert Into dbo.MyTable (ID, TypeId)
Select @newId, *
From dbo.Split(@ParameterValues, ',')
0 голосов
/ 10 октября 2010

Если вы передадите 5 аргументов, вы можете сделать что-то вроде этого:

-- simulation of the arguments
DECLARE @p1 INT, @p2 INT, @p3 INT, @p4 INT, @p5 int;
SELECT @p1=1, @p2=2, @p4=14;

-- Select only parameters which aren't null
SELECT @p1 AS id WHERE @p1 IS NOT NULL
UNION ALL
SELECT @p2 WHERE @p2 IS NOT NULL
UNION ALL
SELECT @p3 WHERE @p3 IS NOT NULL
UNION ALL
SELECT @p4 WHERE @p4 IS NOT NULL
UNION ALL
SELECT @p5 WHERE @p5 IS NOT NULL;
0 голосов
/ 10 октября 2010

Я бы передал XML на сервер SQL, который затем можно легко обработать как набор узлов (например, таблицу), используя OPENXML или функцию nodes() для типа данных xml.Он работает очень хорошо и довольно производительно, почти всегда быстрее, чем любой код ручной обработки строк.

DECLARE @x xml;
SET @x = '<id>01</id><id>02</id><id>03</id><id>14</id><id>15</id>';
SELECT x.id.value('.', 'int') FROM @x.nodes('id') AS x(id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...