2015-05-07 2 views
1

У меня есть массив с тремя строками. Мне нужно включить это в мою хранимую процедуру.Создать сохраненный Proc для массива строк в MSSQL

Мои Backbean

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

Мой Stored Proc. in 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 и здесь находятся переменные в Stored Proc.

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

Я не эксперт в ХП и не знаю, как объявить этот массив в ХП и использовать IN функции для запроса со значениями массива.

+0

Нет такой вещи, как массив в SQL Server. Посмотрите TVP (не знаю, поддерживает ли Java их), а если нет, то используйте функцию разделения строк в T-SQL. См. Http://sqlperformance.com/2012/07/t-sql-queries/split-strings и http://sqlperformance.com/2012/08/t-sql-queries/splitting-strings-now-with -less -t-sql в начале. –

+0

Есть ли способ передать это как ps.setString для запроса с параметром IN? – SamK

+0

Вам нужно будет использовать динамический SQL. Почему вы думаете, что было бы лучше, чем расщепление строки? –

ответ

0

Я решил проблему выше, создав функцию таблицы в сохраненной proc. и отправить мои значения массива функции перед запросом.

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 

и ХП использовать эту линию

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(); 

и объявить массив в фасоли фасоли

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

Функция будет разбивать массив и хранить его в таблице, и, наконец, вы можете отправить эту таблицу для запроса с использованием хранимой процедуры.