我有三个字符串的数组。我需要将它包含在我的存储过程中。
我的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函数查询数组值。
答案 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"};
该函数将拆分数组并存储到表中,最后您可以使用存储过程发送此表进行查询。