我在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脚本或存储过程,所以我愿意接受各种建议。
答案 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;