Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-如何最有效地检查结果集中的重复项_Sql_Sql Server_Duplicates - Fatal编程技术网

SQL Server-如何最有效地检查结果集中的重复项

SQL Server-如何最有效地检查结果集中的重复项,sql,sql-server,duplicates,Sql,Sql Server,Duplicates,我正在编写一个存储过程,它或多或少运行一个“SELECT…”。。。从…起表上的WHERE'语句我希望将查询结果返回给用户,但检查查询结果中是否有重复项。如果有,我想抛出一个错误。否则,应返回结果集 总结起来,代码应该是: 从表中选择 检查SELECT查询结果中是否存在重复项,如果发现任何错误,则抛出错误 如果没有找到,则返回结果集 我目前的想法是,我需要做如下事情: 在相关列上创建具有唯一约束的表变量 从“选择…”插入到表变量中。。。从…起在哪里 如果存在重复项,约束将被违反,我将在catch子

我正在编写一个存储过程,它或多或少运行一个“SELECT…”。。。从…起表上的WHERE'语句我希望将查询结果返回给用户,但检查查询结果中是否有重复项。如果有,我想抛出一个错误。否则,应返回结果集

总结起来,代码应该是:

  • 从表中选择
  • 检查SELECT查询结果中是否存在重复项,如果发现任何错误,则抛出错误
  • 如果没有找到,则返回结果集
  • 我目前的想法是,我需要做如下事情:

  • 在相关列上创建具有唯一约束的表变量
  • 从“选择…”插入到表变量中。。。从…起在哪里
  • 如果存在重复项,约束将被违反,我将在catch子句中处理该问题
  • 如果没有重复项,我的代码将继续并“从@TableVariable中选择*”
  • 一个可能的替代方案可能是CTEs,但我不确定

    我的问题是,这是否是解决此问题的正确方法。

    分问题:

  • 有更好的方法吗
  • 出于某种原因,上述措施是否会失效
  • 因为我做了两次SELECT,所以我的查询速度可能会显著减慢吗?或者,表变量的存储方式是否使得执行第二次选择不会产生太大的“成本”

  • 这取决于需要处理的数据量。结果集有多大?有多少列需要是唯一的?根据你所说的,我看不到更好的方法,尽管最好的解决方案是。编写查询并测试它,检查它是否按预期工作,检查它的运行速度。然后,如果它的运行速度没有您想要的那么快,那么您可以尝试其他方法,看看它们是否更快。根据您提供的信息,这将提供比其他任何人都能提供的更多的洞察力。正如Gareth所说,这不是一个坏主意,只是如果您正在使用事务,并且在检查重复之前有一些操作,则引发错误必须处理回滚事务,因此,有时它会花费很多钱,最好在进入事务之前验证数据。@GordonLinoff-结果集可能会达到数百万行,但不太可能超过数百万行。要唯一的列数实际上不是静态的-可以是1到7,或者您可以使用具有唯一约束的临时表,而不是表变量。因为表变量不是最有效的。这取决于你必须处理的数据量。结果集有多大?有多少列需要是唯一的?根据你所说的,我看不到更好的方法,尽管最好的解决方案是。编写查询并测试它,检查它是否按预期工作,检查它的运行速度。然后,如果它的运行速度没有您想要的那么快,那么您可以尝试其他方法,看看它们是否更快。根据您提供的信息,这将提供比其他任何人都能提供的更多的洞察力。正如Gareth所说,这不是一个坏主意,只是如果您正在使用事务,并且在检查重复之前有一些操作,则引发错误必须处理回滚事务,因此,有时它会花费很多钱,最好在进入事务之前验证数据。@GordonLinoff-结果集可能会达到数百万行,但不太可能超过数百万行。要唯一的列数实际上不是静态的-可以是1到7,或者您可以使用具有唯一约束的临时表,而不是表变量。因为表变量不是最有效的。