当前位置: 首页 > 知识库问答 >
问题:

将数组作为查询的参数从Java发送到SQL Server

祁建业
2023-03-14

我需要的是发送一个数组或一些可以包含多个有序数据的东西,这些数据将在存储过程中读取到,而在SQL Server中,唯一的问题是我不知道如何将参数作为数组或表发送。

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

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


共有2个答案

子车鸿运
2023-03-14

这是我找到的最好的解决方案(感谢用户2067753):(以下内容来自这里)

让我们创建一个Person表,它有一个ID和Name列。

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主题

  • CHARINDEX
  • 子字符串
  • 莱恩

创建函数“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莉莲·贝当古

东方骏
2023-03-14

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

然而,在SQL服务器端,由于可能的性能影响,我将避免使用WHILE循环。相反,一次粉碎并使用数据ll。

 类似资料:
  • 美国东部时间2019.05.14下午4:54更新-好的-下面是说明我的问题的代码-可能我花了太长时间才得到这个,而且可能太长了,但我还是Java新手。无论如何——它可以工作,打开窗体,但无法让第二个按钮看到并对“事件”做出反应。我想我现在是在“提高”活动,好吧——至少它在活动中达到了标准。但是,它仍在运行类代码,而不是通过setOnFormStateChange传入的“自定义”代码????我不确定

  • 问题内容: 我想将数组作为参数传递给SqlQuerySpec,以便在构建对天蓝色的db数据库的查询时可以在IN表达式中使用它。我想做的是像我们对常规参数(字符串,整数等)所做的事情: 但是,这种方式是行不通的。我还有其他方法可以将数组作为参数传递吗?谢谢。 问题答案: 您的查询应如下所示: 那么您可以将其作为数组传递,并检查该数组是否包含文档中属性中具有的值。 参考: https://docs.m

  • 问题内容: 我知道在php中,我只能用来检索以数组形式发送的GET数据,但是在Python中,可能是因为我只收到一个字符串,却无法识别为数组/列表。 如果需要的话,我会用flask/werkzeug。 问题答案: 参数名称的深度解析对于PHP AFAIK是唯一的。 如果你只需要一个简单的列表,只需传递几个具有相同名称的参数并使用(documentation)。 否则,你必须自己解析查询字符串。

  • 问题内容: 我的jphp.php文件包含以下内容: 并且我的javascript文件包含以下内容: 我已经用php编码了数据数据..现在我想将这两个数据数组发送到javascript …我不知道要使用的正确命令。我对谷歌搜索感到困惑。 请帮忙 。 问题答案: 使用jQuery的简单特定示例: JavaScript页面: 在您的php中:

  • 我正在使用标准的谷歌分析片段在页面发送信息到谷歌分析。 由于各种原因,我的页面是通过查询参数到达的。 在一个理想的世界,这不会是情况,但这不是一个完美的世界,所以我必须避免它发送到谷歌分析,因为它包含个人信息。 我一直在手动向url添加一个查询参数,并使用ObservePoint检查内容。内容信息包含“http://localhost/my/URL/page?uiop=qwert”得文档位置URL

  • 我正在努力想办法让这个工作。我想如果我发送一个数组作为另一个函数的参数,我就可以清除它,但是每次我都从它发送到的函数中得到错误。我试图过滤两个充满坐标{x:, y:}的2D数组。一切都运行良好,除了我不能清除后,每次我把它传递给我的函数。如果我试图清除它,我会从我的函数中得到错误。 我不指望它会像我想的那样,一旦它作为一个论点被发送出去,它就不再重要了。我还尝试了以多种方式创建副本,但无论如何,通