我的问题标题可能看起来令人困惑,因为我无法在这里形成逻辑。我对存储过程知之甚少,因此可能存在一些我缺少的SQL特性。我的问题是我在SQL Server数据库中有一个表。其中一列包含分号分隔值。这些值实际上是另一个表的行的标识。因此,我的任务是从这个以分号分隔的列表中逐个获取这些ID,这些列可以满足Name
列值并获取具有相同ID的另一个表的行。我发布了一个我想在SQL Server存储过程中实现的通用算法(基于C#和SQL):
DECLARE X AS ROWS = GetRowsFromTable1ByName('ABC');
DECLARE RESULT AS ROWS;
DECLARE Y AS ARRAY;
FOREACH(ID1 in X) //ID1 denotes ID column from Table1
{
Y = ID1.Split(';');
FOREACH(ID2 in Y) //ID2 denotes ID column from Array Y
{
RESULT.ADDROWS(GetRowsFromTable2ById(ID2))
}
}
RETURN RESULT;
表1:
Name ID
==== ==
ABC 7;8;9
PQR 1;2;3
ABC 4;5;6
表2:
ID Class
== =====
1 A
2 B
3 C
4 D
5 E
6 F
7 G
8 H
9 I
所需的输出表:
ID Class
== =====
4 D
5 E
6 F
7 G
8 H
我可以在C#中的业务逻辑层实现它,但我想在存储过程的数据层实现它。因此,只有一次调用数据库服务器。以下是我的进展,但由于缺乏SQL知识,我无法继续:
DECLARE @delimitedArray VARCHAR(MAX) = '4;2;3;'
DECLARE @delimiter CHAR = ';'
DECLARE @item VARCHAR(MAX)
WHILE LEN(@delimitedArray) > 0
BEGIN
SET @item = LTRIM(SUBSTRING(@delimitedArray, 1, CHARINDEX(@delimiter, @delimitedArray) - 1));
SET @delimitedArray = SUBSTRING(@delimitedArray, CHARINDEX(@delimiter, @delimitedArray) + 1, LEN(@delimitedArray));
PRINT @item
END
请帮忙。