根据以冒号分隔并存储在另一个表中的值选择另一个表行

时间:2015-04-23 15:53:45

标签: sql sql-server database sql-server-2008 stored-procedures

我的问题标题可能看起来令人困惑,因为我无法在这里形成逻辑。我对存储过程知之甚少,因此可能存在一些我缺少的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

请帮忙。

0 个答案:

没有答案