1

我必须修改一个存储过程,它以 CSV varchar(MAX) 格式插入作为输入参数传递的数据,但现在我必须将两个列表传递给 SP,并且必须将其插入表中

我传递的数据如下

lstid = 1,2,3,4,5 etc.
lstvalue = 10,20,22,35,60 etc.

这里 lstid 映射到 lstvalue,意味着 lstid = 1 的值为 10,lstid = 2 的值为 20,依此类推

我应该怎么做才能根据映射插入记录

我正在使用一个函数来分离 CSV 值并将其存储在 temptable 中,但它仅适用于一列

功能和这里一样

http://www.sqlteam.com/Forums/topic.asp?TOPIC_ID=14185

4

3 回答 3

1

如果您被迫在存储过程中执行此操作并且您的数组大小相等,您可以加入两个列表,拆分它们,然后加入位置(每个数组中的元素数)以获得您需要的链接集。

下面的示例使用数字表,但您可以用任何替换该拆分操作。

-- if you dont have a number table:
/*
   create table [dbo].[Number](n int not null primary key clustered);
   insert into dbo.Number
        values  (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),
                (11),(12),(13),(14),(15),(16),(17),(18),(19),(20)

*/

declare @lstid varchar(100) = '1,2,3,4,51',
        @lstvalue varchar(100) = '10,20,22,35,60'


declare @Length tinyint,
        @Input  varchar(8000),
        @Delimiter  char(1)

-- sanity check
if len(@lstid)-len(replace(@lstid, ',', '')) <> len(@lstvalue)-len(replace(@lstvalue, ',', ''))
begin
    raiserror('lists are not equal', 16, 1);
    return;
end

--count the numbers of elements in one of the arrays
select @Length = len(@lstid)-len(replace(@lstid, ',', ''))+1;

--join the two arrays into one
select @Input = @lstid + ',' + @lstvalue;

set @Delimiter = ',';

;with cte (i,s)
as  (   
        select  row_number() over (order by n.n asc) [i],
                substring(@Delimiter + @Input + @Delimiter, n.n + 1, charindex(@Delimiter, @Delimiter + @Input + @Delimiter, n.n + 1) - n.n - 1) [s]
        from    dbo.Number n
        where   n.n = charindex(@Delimiter, @Delimiter + @Input + @Delimiter, n.n) and
                n.n <= len(@Delimiter + @Input)
    )
select  a.s, b.s
from    cte a
join    cte b on
        a.i+@Length = b.i
order
by      a.i;

return
于 2012-05-09T23:54:04.810 回答
0

您可以将参数列表作为 XML 传递。

参数:

<lst><id>1</id><value>10</value></lst>
<lst><id>2</id><value>20</value></lst>
<lst><id>3</id><value>22</value></lst>
<lst><id>4</id><value>35</value></lst>
<lst><id>5</id><value>60</value></lst>

和程序

create procedure AddXML
  @XML xml
as
insert into YourTable(id, value)
select N.value('id[1]', 'int'),
       N.value('value[1]', 'int')
from @XML.nodes('/lst') as T(N)
于 2012-05-09T12:39:33.180 回答
0

使用 .net 代码中的数据创建一个数据表并将其传递给 SP。

如何从.net将数据表传递给Sp

于 2012-05-09T12:34:34.563 回答