我需要的是发送Array
或可能包含多个有序数据的内容,这些数据将被WHILE
Stored Procedure
中的SQL Server
内的Arrays
cyle读取唯一的问题是我不知道如何将参数作为数组或表格发送。
如果某种方式不涉及{{1}},但仍然保留将多个数据发送到单个参数的想法,那么我将非常感激。
注意:我将使用JDBC将参数从Java发送到SQL Server
答案 0 :(得分:1)
您可以将其作为逗号分隔列表发送,并在SQL Server端将其粉碎,或者您可以使用XML变量并粉碎XML数据。
但是,在SQL Server端,由于可能的性能影响,我会避免使用WHILE循环。相反,一次撕碎并使用数据ll。
答案 1 :(得分:0)
只是分享,这是我找到的最佳解决方案(感谢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字符串并返回名称
的名称CREATE PROCEDURE GetPersonsByIds @Ids VARCHAR(8000)
AS
BEGIN
SELECT * FROM Person
WHERE ID IN (SELECT * FROM SplitDelimiterString(@Ids, ','))
END
现在将Ids传递给存储过程,让我们看看输出是什么
EXEC GetPersonsByIds '3,7,9'
输出:
ID名称
3 Amancio Ortega
7大卫科赫9 Liliane Bettencourt