在MSSQL中为字符串数组创建存储过程

时间:2015-05-07 01:39:46

标签: java arrays sql-server-2008

我有三个字符串的数组。我需要将它包含在我的存储过程中。

我的Backbean

private String [] model_NU= {"'N'", "'U'", "'D'"};

我的存储过程在Java中

String stm = "{call myDB.dbo.StoredPorcQuery (?,?,?,?,?,?,?,?,?,?,?,?)}";
try {   
        ps = con.prepareStatement(stm);
        ps.setArray(1, fb.getModel_nu());
        --------
        rs = ps.executeQuery();

我使用的是MS SQL Server Management Studio,这里是存储过程中的变量。

-----
ALTER PROCEDURE  [dbo].[StoredPorcQuery] 
@model_nu varchar (6)='%', ->Not sure here I need to use varchar to represent array
----
WHERE----
table1.model_nu IN (@model_nu)  ->Not sure this part.

我不是Stored proc的专家,不知道如何在Stored Proc中声明这个数组,并使用IN函数查询数组值。

1 个答案:

答案 0 :(得分:0)

我通过在存储过程中创建表函数解决了上述问题。并在查询之前将我的数组值发送给函数。

SQL函数(dbo.fnSplitString)创建表和单独的字符串','

USE [MYTable]
GO
/****** Object:  UserDefinedFunction [dbo].[fnSplitString]    Script Date: 05/08/2015 16:06:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
        IF @end = 0  
            SET @end = LEN(@string) + 1

        INSERT INTO @output (splitdata)  
        VALUES(SUBSTRING(@string, @start, @end - @start)) 
        SET @start = @end + 1 
        SET @end = CHARINDEX(@delimiter, @string, @start)

    END 
    RETURN 
END

并在Stored Proc中使用此行

ALTER PROCEDURE  [dbo].[StoredPorcQuery] 
@model_nu varchar (10)='%',
----
WHERE----
table1.model_nu  IN (select *from dbo.fnSplitString(@model_nu, ','))

和Java

String stm = "{call myDB.dbo.StoredPorcQuery (?,?,?,?,?,?,?,?,?,?,?,?)}";
try {   
        ps = con.prepareStatement(stm);
        ps.setString(1, fb.getModel_nu());
        --------
        rs = ps.executeQuery(); 

并在Back Beans中声明数组

private String [] model_NU= {"N","U","D"};

该函数将拆分数组并存储到表中,最后您可以使用存储过程发送此表进行查询。