插入从字符串中提取的未知数量的值的语句

时间:2010-10-10 15:49:04

标签: php sql sql-server tsql sql-server-2008

我在sql server 2008 db中有一个存储过程 此存储过程采用一个参数,该参数是最多5个逗号分隔的整数值的列表。这个字符串通过php sript传递,格式如下:

01,02,03,14,15

这些值应该在此表中:

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

...其中id相同,type id是逗号分隔值之一。

显然,我可以有一个像“01,02,03”的字符串,只有3个值。所以我需要一种在上表中只插入3行的方法,结果是:

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

我可以修改php脚本或存储过程,所以我愿意接受各种建议。

3 个答案:

答案 0 :(得分:1)

您可以创建一个功能来帮助您完成此操作。

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%确定ID值的来源,所以我声明了一个变量。

Declare @newId int
Set @newId = 1

Insert Into dbo.MyTable (ID, TypeId)
Select @newId, *
From dbo.Split(@ParameterValues, ',')

答案 1 :(得分:0)

我会将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);

答案 2 :(得分:0)

如果您传入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;