【问题标题】:sql server - inserting rank column in SP table-parametersql server - 在 SP 表参数中插入排名列
【发布时间】:2015-06-10 10:11:47
【问题描述】:

我的问题与此类似: how to maintain order while doing join in sql

基本上,我在存储过程中有一个表参数,其中包含特定顺序的一些 ID。我想在内部联接中使用这些 ID,并根据输入表参数的顺序返回结果。因此,我必须找到一种方法来构建一个包含排名和 ID 的新表。

从我在类似帖子上看到的情况来看,没有办法在 SQL 中实现这一点,除非我还从外部非 SQL 世界(在我的表参数内)提供一些额外的排名列?

这对我来说似乎很陌生...... 真的是这样吗?

更新:

(显然,我不能使用 ROW_NUMBER() 或 RANK(),因为它们需要按列排序,而我的表中只有 ID)

基本上,我的输入表是这样的形式:

CREATE TYPE [dbo].[IdTable] AS TABLE(
    [Id] [int] NOT NULL
)

它作为参数提供给我的 SP。

【问题讨论】:

  • 你有表结构、数据和你想要的输出的例子吗?
  • 能否修改存储过程为订单输出一列?如果存储过程没有以确定的方式对数据进行排序,那么尝试强制查询结果以相同的顺序排列就没有什么意义了!
  • @EdB 不,该表来自外部世界,而不是来自 SQL。这是我唯一可以创建订单列的地方,但我想避免它。也许,您在下面的答案(使表类型包含 IDENTITY 列)会有所帮助(我之前没有在表类型中尝试过)。至于SP,我打算按列排序(创建的顺序/排名列),只是我还没有这个列。
  • 在下面查看我对我的回答的评论;您可以欺骗 SQL Server 对无序结果使用排名函数。你是否应该是另一回事......

标签: sql sql-server sql-order-by


【解决方案1】:
  1. 现在将 identity 启用种子的列添加到您的输入表中,列将自动填充它们插入的物理顺序。
  2. 加入后使用此列排序

【讨论】:

  • 我一定会试试这个! :)
  • 我现在已经尝试过这样做,但似乎我使用的 DataTable 类不允许插入列数少于表的列数的行(所以我不能省略 IDENTITY列并让它自动递增)。我所做的是从 C# 代码中提供排名列值。
  • 你能在你得到错误的地方显示插入查询吗? (您需要从插入中省略新列),更好的方法是在末尾添加这个新列
  • 是的,我知道。但我使用的是生成所有 SQL 的包装类。而且我无法绕过这门课。这就是为什么这个解决方案对我不起作用。不过,对于其他情况,它应该是一个可行的解决方案。 :)
【解决方案2】:

听起来你所追求的是一个带有排名功能的子查询:

https://msdn.microsoft.com/en-us/library/ms189798.aspx

如果您使用生成的列构建子查询,例如ROW_NUMBER(),以及该子查询的别名并加入它,然后您可以按该列对查询结果进行排序。

【讨论】:

  • 如果您不对结果进行排序,则无法保证 SQL Server 将返回它们的顺序,因为它取决于用于生成它们的执行计划。
  • 我认为我不能在输入表参数上使用 ROW_NUMBER() 或 RANK(),因为它们需要按列排序。而且我只有身份证。
  • 显然,这行得通:row_number() over (order by (select 1))。从这里:stackoverflow.com/questions/20232641/…
  • 这会欺骗 ORDER BY 使用结果集的自然顺序(本质上,每一行都有相同的排名) - 我很惊讶地看到 SQL Server 允许这样做,就像在大多数情况下一样结果将是不确定的。
  • 我认为这是稳定的,因为它不会重新排序您的结果,因此它会按照从存储过程返回的相同顺序对记录进行编号。注意ORDER BY 不一定是SELECT 1,它可以是任何常量;其他示例使用SELECT NULLstackoverflow.com/questions/10066819/…
【解决方案3】:

我认为您可以在输入表参数的结构中使用一个新的表变量,并为排名/行号(可能是标识列)使用一个新列。 然后你只需要填写表格变量就像

INSERT INTO @tableVar(...) SELECT (...) FROM @inputTableParameter

您可以使用新的表变量和行号/排名列做任何事情。

【讨论】:

    【解决方案4】:

    我曾尝试在列上使用 IDENTITY,但似乎我使用的 DataTable 类不允许插入列数少于表的列数的行(因此当我无法省略 IDENTITY 列时插入数据并让它自动递增)。

    我所做的是提供来自 C# 代码的排名列值,并在我的 SP 中按该列排序。

    不是我能想象的最好的解决方案,但至少它有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      相关资源
      最近更新 更多