有没有办法根据行号获取列值?

时间:2015-06-26 14:46:23

标签: c# sql sql-server rows traversal

我的SQL Server数据库中有一个表值函数[dbo].GetValues(),用C#编写。此函数返回参数中指定的文本内的整数表。例如,[dbo].GetValues('232dasdg34vb3')将返回以下表格:

| Ints |
| ---- |
| 232  |
| 34   |
| 3    |

现在我试图在WHILE循环中使用这个结果表:

DECLARE @IntCount int = (SELECT COUNT(*) FROM [dbo].GetValues('232dasdg34vb3'))
WHILE(@IntCount > 0)
BEGIN
    -- What to do here??
    SET @IntCount = @IntCount - 1
END

那么,有没有什么方法可以使用一些索引或行号在这个while循环中逐个访问这些行?

另请注意,我无法访问GetValues()的源代码。

更新(实际问题)

数据库A1,A2和A3中有三个表。所有这些表都有一个列[ID],它是以下列方式作为其他表的外键:

[A1].[ID] is connected to [A2].[A1ID]
[A2].[ID] is connected to [A3].[A2ID]

作为参数传递给该函数的文本包含整数,这些整数是A3表的[ID]。现在,我希望使用A3表的[ID]来显示A1和A2表中的行。

我现在拥有您所建议的所有选项,包括游标和联接。但哪一个更适合这种情况以及如何做到这一点?

3 个答案:

答案 0 :(得分:3)

修改

select * 
from A1
join A2 on [A1].[ID] = [A2].[A1ID]
join A3 on [A2].[ID] = [A3].[A2ID]
join [dbo].GetValues('232dasdg34vb3') V on A3.ID = v.Ints

您可以使用游标:

 DECLARE @i INT

 DECLARE cur CURSOR FAST_FORWARD READ_ONLY FOR
 SELECT Ints FROM [dbo].GetValues('232dasdg34vb3')

 OPEN cur

 FETCH NEXT FROM cur INTO @i

 WHILE @@FETCH_STATUS = 0
 BEGIN

 /* cursor logic -- @i will hold 232, then 34, then 3 */

 FETCH NEXT FROM cur INTO @i

 END

 CLOSE cur
 DEALLOCATE cur

如果你在另一个表中有IDs,你可以加入调用表值函数的结果:

select * from SomeTable st
join [dbo].GetValues('232dasdg34vb3') ft on st.SomeID = ft.Ints 

答案 1 :(得分:2)

如果您只需要选择一些记录,可以通过简单的选择来完成工作:

DECLARE @Value VARCHAR(Max) = '232dasdg34vb3'

SELECT A1.Id, A2.Id
FROM A1 
     JOIN A2 ON A1.Id = A2.A1Id
     JOIN A3 ON A2.Id = A3.A2Id
WHERE EXISTS (
              SELECT 1 
              FROM [dbo].GetValues( @Value ) x 
              WHERE x.Ints = A3.Id
             ) 

答案 2 :(得分:1)

不要使用循环或游标,而是设置基于以下的方法:

SELECT x.Ints, ot.ID, ot.*
FROM OtherTable ot 
WHERE ot.ID IN (SELECT x.Ints FROM [dbo].GetValues('232dasdg34vb3'))