2017-03-21 3 views
0

を挿入します。は、ストアドプロシージャに配列を渡し、私はテーブルにこれらの値を挿入する必要があり、これらの値のSQL Server

ID Col1 col2 date 
1  10 5 getdate() 
2  20 5 getdate() 
3  30 5 getdate() 

第1列は、文字列'10に来る20,30' と私は機能を使用していますデータ

CREATE FUNCTION dbo.SplitInts 
(
    @List  VARCHAR(MAX), 
    @Delimiter VARCHAR(255) 
) 
RETURNS TABLE 
AS 
    RETURN (SELECT Item = CONVERT(INT, Item) FROM 
     (SELECT Item = x.i.value('(./text())[1]', 'varchar(max)') 
     FROM (SELECT [XML] = CONVERT(XML, '<i>' 
     + REPLACE(@List, @Delimiter, '</i><i>') + '</i>').query('.') 
     ) AS a CROSS APPLY [XML].nodes('i') AS x(i)) AS y 
     WHERE Item IS NOT NULL 
); 
GO 

ストアドプロシージャ

SELECT @lenList = Count(Item) FROM dbo.SplitInts(@Col1List, ','); 
IF @lenList > 0 

     WHILE @i <= @lenList 
     BEGIN 
      SELECT @col1 = CONVERT(INT,Item) FROM dbo.SplitInts(@Col1List, ','); 


      INSERT 
      INTO [dbo].[Table1] 
      (
       [Col1], 
       [Col2], 
       [CreatedOn], 
      ) 
      VALUES 
      (
       @col1, 
       @col2, 
       getdate() 
      ) 

      SET @i = @i+1 
     END 

を解析し、取得するためにsplintintしかし、問題は、私が見る唯一の最後のrとしますowは毎回、すなわち30,5ここに挿入されます。私はここで間違って何をしていますか?どんな助けもありがとうございます。

+4

痛いです。あなたは素敵なセットベースのスプリッタを持っていますが、あなたはまだループしています。その種の目的を破る。もちろん、最善のアプローチは、区切りリストの代わりにテーブル値のパラメータを渡すことです。次に、テーブルのように簡単に使用できます。それらについては、https://msdn.microsoft.com/en-us/library/bb675163(v=vs.110).aspxと、ここでどのように使用できるかについて読むことができます。 https://msdn.microsoft.com/en-us/library/bb510489.aspx –

答えて

0

私は、次の手順を実行して、この問題を解決:

INSERT 
    INTO [dbo].[Table1] 
    (
     [Col1], 
     [Col2], 
     [CreatedOn], 
    ) 
Select 
    Item As Col1 
    ,@Col2 
    ,GETDATE() 
From 
dbo.SplitInts(@Col1List, ','); 
関連する問題