1

入力パラメータとして渡されたデータをCSVvarchar(MAX)形式で挿入するストアドプロシージャを変更する必要がありますが、2つのリストを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に格納する関数を使用していますが、1つの列で機能します

機能はこちらと同じです

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

4

3 に答える 3

1

ストアドプロシージャでこれを実行する必要があり、配列のサイズが等しい場合は、2つのリストを結合して分割し、位置(各配列の要素数)で結合して、必要なリンクセットを取得できます。

次の例では数値テーブルを使用していますが、その分割操作を任意のものに置き換えることができます。

-- 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

.netコードのデータを使用してデータテーブルを作成し、それをSPに渡します。

.netからSpにデータテーブルを渡す方法

于 2012-05-09T12:34:34.563 に答える
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 に答える