【问题标题】:Send an Array as a parameter of a query from Java to SQL Server将数组作为查询的参数从 Java 发送到 SQL Server
【发布时间】:2014-10-03 02:34:26
【问题描述】:

我需要发送一个Array 或可以包含多个有序数据的东西,这些数据将被读入Stored ProcedureSQL Server 中的WHILE cyle,唯一的问题是我没有知道如何将参数作为数组或表格发送。

如果有一种方法不涉及Arrays,但仍保留将多个数据发送到单个参数的想法,我将不胜感激。

注意:我将使用 JDBC 将参数从 Java 发送到 SQL Server

【问题讨论】:

标签: java sql sql-server parameters parameter-passing


【解决方案1】:

您可以将其作为逗号分隔的列表发送并在 SQL Server 端分解,或者您可以使用 XML 变量并分解 XML 数据。

但是,在 SQL Server 端,由于可能影响性能,我会避免使用 WHILE 循环。相反,一次切碎并使用数据。

【讨论】:

【解决方案2】:

只是为了分享,这是我找到的最佳解决方案(感谢user2067753): (以下内容来自here

让我们创建一个包含 ID 和 Name 列的 Person 表。

CREATE TABLE Person(
ID INT IDENTITY(1,1) NOT NULL,
Name VARCHAR(200) NOT NULL
    CONSTRAINT PK_Person PRIMARY KEY CLUSTERED (ID ASC)
    WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, 
              ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] 

我们必须创建表格值函数,它将逗号分隔的字符串拆分为表格

在开始之前,我建议您阅读 MSDN 上的以下主题

创建函数'SplitDelimiterString',它将用分隔符分割字符串。

CREATE FUNCTION SplitDelimiterString (@StringWithDelimiter VARCHAR(8000), @Delimiter VARCHAR(8))

    RETURNS @ItemTable TABLE (Item VARCHAR(8000))

    AS
    BEGIN
        DECLARE @StartingPosition INT;
        DECLARE @ItemInString VARCHAR(8000);

        SELECT @StartingPosition = 1;
        --Return if string is null or empty
        IF LEN(@StringWithDelimiter) = 0 OR @StringWithDelimiter IS NULL RETURN; 

        WHILE @StartingPosition > 0
        BEGIN
            --Get starting index of delimiter .. If string
            --doesn't contain any delimiter than it will returl 0 
            SET @StartingPosition = CHARINDEX(@Delimiter,@StringWithDelimiter); 

            --Get item from string        
            IF @StartingPosition > 0                
                SET @ItemInString = SUBSTRING(@StringWithDelimiter,0,@StartingPosition)
            ELSE
                SET @ItemInString = @StringWithDelimiter;
            --If item isn't empty than add to return table    
            IF( LEN(@ItemInString) > 0)
                INSERT INTO @ItemTable(Item) VALUES (@ItemInString);            

            --Remove inserted item from string
            SET @StringWithDelimiter = SUBSTRING(@StringWithDelimiter,@StartingPosition + 
                         LEN(@Delimiter),LEN(@StringWithDelimiter) - @StartingPosition)

            --Break loop if string is empty
            IF LEN(@StringWithDelimiter) = 0 BREAK;
        END

        RETURN
    END

让我们创建一个存储过程,它将接受 Ids 字符串并根据这些 Ids 返回名称

CREATE PROCEDURE GetPersonsByIds  @Ids VARCHAR(8000)
AS
BEGIN
    SELECT * FROM Person
    WHERE ID IN (SELECT * FROM SplitDelimiterString(@Ids, ','))
END

现在将 ID 传递给存储过程,让我们看看输出是什么

EXEC GetPersonsByIds '3,7,9'

输出:

ID 名称

3 阿曼西奥·奥尔特加

7 大卫·科赫

9 莉莉安·贝当古

【讨论】:

    猜你喜欢
    • 2021-03-30
    • 2014-04-23
    • 2021-03-30
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多