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

18 浏览
0 Comments

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

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

| Ints |

| ---- |

| 232 |

| 34 |

| 3 |

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

DECLARE @IntCount int = (SELECT COUNT(*) FROM [dbo].GetValues('232dasdg34vb3'))
WHILE(@IntCount > 0)
BEGIN
    -- 在这里该怎么做??
    SET @IntCount = @IntCount - 1
END

所以,有没有办法在这个while循环中逐行访问这些行,使用一些索引或行号?

另外,请注意我没有访问GetValues()的源代码。

更新(实际问题)

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

[A1].[ID]与[A2].[A1ID]连接
[A2].[ID]与[A3].[A2ID]连接

作为函数参数传递的文本包含的整数是A3表的[ID]。现在,我想使用A3表的[ID]获取A1和A2表的行。

我现在拥有你们提出的所有选项,包括游标和连接。但哪个对于这种情况更优化,如何做呢?

0
0 Comments

在给定行号的基础上,获取列值的方法有很多种。本文将介绍一种基于集合的方法来解决这个问题。

在解决问题之前,我们首先要了解问题的原因。问题的出现可能是因为需要根据行号获取相应的列值,但是传统的使用循环或游标的方法效率较低。因此,我们需要找到一种更优化的解决方法。

以下是一种使用集合的方法来解决这个问题的示例代码:

SELECT x.Ints, ot.ID, ot.*

FROM OtherTable ot

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

这段代码使用了一个子查询来获取行号对应的列值。首先,我们使用函数[dbo].GetValues('232dasdg34vb3')获取到一个包含所需行号的集合。然后,我们将这个集合作为条件传递给主查询,通过WHERE子句来筛选出对应的列值。

这种方法相比于传统的使用循环或游标的方法更加高效,因为它是基于集合的操作,可以一次性处理多个行号,而不需要逐个遍历。因此,它适用于大数据量的情况,可以提高查询的执行效率。

基于集合的方法是一种更优化的解决问题的方法。通过使用子查询和WHERE子句,我们可以根据行号获取相应的列值,从而提高查询的效率。如果你在解决类似问题时遇到困难,可以尝试使用这种方法来解决。

0
0 Comments

有时候我们需要根据行号来获取列的值,但是在SQL中并没有直接的方法来实现这个功能。下面的讨论就是关于这个问题的出现原因和解决方法。

在上述讨论中,用户提到了一个简单的选择语句来获取所需的记录。但是他们也提到了一个问题,就是他们在代码中看到了一个不熟悉的语法。根据上下文来看,这个语法是一个用户定义的变量。

用户进一步解释了他们的问题,并且提到了使用游标或循环来解决这个问题。然而,其他用户建议他们避免使用游标或循环,因为这样的方法可能会影响性能。

总结而言,这个问题的原因是SQL中没有直接的方法来根据行号获取列的值。然而,用户可以使用用户定义的变量来实现这个功能。另外,避免使用游标或循环可以提高性能。

0
0 Comments

问题的出现是因为用户想要根据行号获取列的值。解决方法有两种:一种是使用游标,另一种是将表值函数的结果与另一个表进行连接。使用游标的方法如下:

DECLARE @Ints INT
DECLARE cur CURSOR FAST_FORWARD READ_ONLY FOR
SELECT Ints FROM [dbo].GetValues('232dasdg34vb3')
OPEN cur
FETCH NEXT FROM cur INTO @Ints
WHILE @@STATUS = 0
BEGIN
    -- cursor logic -- will hold 232, then 34, then 3
    FETCH NEXT FROM cur INTO @Ints
END
CLOSE cur
DEALLOCATE cur

另一种方法是将表值函数的结果与另一个表进行连接:

SELECT * FROM SomeTable st
JOIN [dbo].GetValues('232dasdg34vb3') ft ON st.SomeID = ft.Ints

用户还问到了是否会不必要地为每个获取操作调用函数,以及是否可以使用`SELECT *`,而不是`SELECT ColName`。对于第一个问题,由于游标的逻辑是一次获取一个值,所以每次获取都会调用函数。对于第二个问题,由于函数只返回一个名为`Ints`的列,所以`SELECT *`可以使用。

最后,用户表示感谢并确认问题已解决。他还提到自己对连接操作不太熟悉,但在这个具有挑战性的情况下,他看到了连接操作的潜力。

0