在SQL中更新表的存储过程

时间:2017-02-16 17:33:59

标签: sql-server sql-server-2008 tsql stored-procedures

我有以下问题......

我有三个变量,v1,v2,v2(所有类型都是java.util.ArrayList)。我想编写一个存储过程,将该变量作为输入并更新一个表。

如何在sql中循环抛出变量的数组列表并更新表? 例如,v1(10,11,12),v2(21,22,23),v3(31,32,33)的值。表的sql更新应如下所示 表格1: 第1行:10,21,31 第2行:11,22,32 第3行:12,23,33

如果有人可以回复我,请告诉我如何为此编写商店程序,我将感激不尽。

1 个答案:

答案 0 :(得分:0)

我使用过这种方法,对我来说非常合适。

让您的存储过程接收三个变量,每个变量为varchar(max) - 如果您知道大小,则可以写入数字而不是max。例如:

create procedure usp_testSP
    @v1 varchar(max),
    @v2 varchar(max),
    @v3 varchar(max)
as
begin
    declare @v1Values table (number int);

    insert into @v1values
    select * from dbo.fnSplit(@v1,','); -- the fnSplit function is given below

    -- this way you can retrieve all values for other two variables
    -- then you can use the corresponding tables, i.e.: @v1Values to complete the steps you need to.
end

以下是dbo.fnSplit(@inputList, @delimiter)的代码:

 CREATE FUNCTION [dbo].[fnSplit](@sInputList VARCHAR(max), @sDelimiter VARCHAR(10) = ',')
 RETURNS @List TABLE (item varchar(100))
 BEGIN
     DECLARE @sItem varchar(100)
     WHILE CHARINDEX(@sDelimiter, @sInputList, 0) <> 0
     BEGIN

         SELECT @sItem = RTRIM(LTRIM(SUBSTRING(@sInputList, 1, CHARINDEX(@sDelimiter, @sInputList,0) - 1))),
                @sInputList = RTRIM(LTRIM(SUBSTRING(@sInputList, CHARINDEX(@sDelimiter, @sInputList, 0) + LEN(@sDelimiter),LEN(@sInputList))))

         IF LEN(@sItem) > 0

         INSERT INTO @List SELECT @sItem

     END

     IF LEN(@sInputList) > 0
     BEGIN
         INSERT INTO @List SELECT @sInputList
     END
     RETURN
 END

最后,在您的java代码中,您可以将列表转换为字符串并将其传递给存储过程调用。

List<Integer> v1; //suppose this is the list that contains the values.
String s = String.join("," /*this is the delimiter. It should be the same as the one you use when you call the dbo.fnSplit() function.*/, v1);