有没有办法根据行号获取列值?
Is there any way to get column value on the basis of row number?
我的 SQL 服务器数据库中有一个 table 值函数 [dbo].GetValues()
,它是用 C# 编写的。此函数 return 是参数中指定文本内的 table 整数。例如,[dbo].GetValues('232dasdg34vb3')
将 return 跟随 table:
| Ints |
| ---- |
| 232 |
| 34 |
| 3 |
现在我试图在 WHILE
循环中使用这个结果 table:
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中有3个table。所有这些 table 都有一个列 [ID],它是其他 table 的外键,如下所示:
[A1].[ID] is connected to [A2].[A1ID]
[A2].[ID] is connected to [A3].[A2ID]
作为参数传递给函数的文本包含作为 A3 table 的 [ID] 的整数。现在,我想要使用 A3 table.
的 [ID] 来自 A1 和 A2 table 的行
我现在有了你们建议的所有选项,包括游标和连接。但是对于这种情况,哪个更优化,如何做呢?
如果您只需要 select 一些记录,一个简单的 select 就可以完成这项工作:
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
)
编辑:
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
如果你在另一个 table 中有那些 IDs
你可以加入调用 table 值函数的结果:
select * from SomeTable st
join [dbo].GetValues('232dasdg34vb3') ft on st.SomeID = ft.Ints
不要使用循环或游标,而是使用基于集合的方法,例如:
SELECT x.Ints, ot.ID, ot.*
FROM OtherTable ot
WHERE ot.ID IN (SELECT x.Ints FROM [dbo].GetValues('232dasdg34vb3'))
我的 SQL 服务器数据库中有一个 table 值函数 [dbo].GetValues()
,它是用 C# 编写的。此函数 return 是参数中指定文本内的 table 整数。例如,[dbo].GetValues('232dasdg34vb3')
将 return 跟随 table:
| Ints |
| ---- |
| 232 |
| 34 |
| 3 |
现在我试图在 WHILE
循环中使用这个结果 table:
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中有3个table。所有这些 table 都有一个列 [ID],它是其他 table 的外键,如下所示:
[A1].[ID] is connected to [A2].[A1ID]
[A2].[ID] is connected to [A3].[A2ID]
作为参数传递给函数的文本包含作为 A3 table 的 [ID] 的整数。现在,我想要使用 A3 table.
的 [ID] 来自 A1 和 A2 table 的行我现在有了你们建议的所有选项,包括游标和连接。但是对于这种情况,哪个更优化,如何做呢?
如果您只需要 select 一些记录,一个简单的 select 就可以完成这项工作:
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
)
编辑:
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
如果你在另一个 table 中有那些 IDs
你可以加入调用 table 值函数的结果:
select * from SomeTable st
join [dbo].GetValues('232dasdg34vb3') ft on st.SomeID = ft.Ints
不要使用循环或游标,而是使用基于集合的方法,例如:
SELECT x.Ints, ot.ID, ot.*
FROM OtherTable ot
WHERE ot.ID IN (SELECT x.Ints FROM [dbo].GetValues('232dasdg34vb3'))