Tsql SQL Server 2000 TOP和OUTPUT关键字

Tsql SQL Server 2000 TOP和OUTPUT关键字,tsql,sql-server-2000,Tsql,Sql Server 2000,此查询在SQLServer2005和2008中非常有效。如何在SQLServer2000中编写它 UPDATE TOP 10 myTable SET myBooleanColumn = 1 OUTPUT inserted.* 除了运行多个查询,还有什么方法可以做到这一点吗?老实说,您的查询没有什么意义,我很难理解您的“很棒”标准。当然,它更新了10行,并且没有给出错误。但是你真的不在乎它更新了哪10行吗?当前的TOP没有ORDER BY表明您希望SQL Server决定更新哪些行(这正是它将要

此查询在SQLServer2005和2008中非常有效。如何在SQLServer2000中编写它

UPDATE TOP 10 myTable
SET myBooleanColumn = 1
OUTPUT inserted.*

除了运行多个查询,还有什么方法可以做到这一点吗?

老实说,您的查询没有什么意义,我很难理解您的“很棒”标准。当然,它更新了10行,并且没有给出错误。但是你真的不在乎它更新了哪10行吗?当前的
TOP
没有
ORDER BY
表明您希望SQL Server决定更新哪些行(这正是它将要做的)

要在SQL Server 2000中实现这一点(无需使用触发器),我认为您需要执行以下操作:

SET NOCOUNT ON;

SELECT TOP 10 key_column
INTO #foo
FROM dbo.myTable
ORDER BY some_logical_ordering_clause;

UPDATE dbo.MyTable
SET myBooleanColumn = 1
FROM #foo AS f
WHERE f.key_column = dbo.MyTable.key_column;

SELECT * FROM dbo.MyTable AS t
INNER JOIN #foo AS f
ON t.key_column = f.key_column;
如果需要一个简单的查询,则可以使用以下触发器:

CREATE TRIGGER dbo.upd_tr_myTable
ON dbo.myTable
FOR UPDATE
AS
BEGIN
  SET NOCOUNT ON;

  SELECT * FROM inserted;
END
GO
请注意,此触发器无法判断您是否正在执行前10个更新或其他操作,因此所有用户在执行更新时都将获得此结果集。即使您过滤if UPDATE(myBooleanColumn),其他用户仍可能更新该列


在任何情况下,您仍然需要修复update语句,以便知道要更新哪些行。(甚至可以考虑<代码> < < /Cord>子句>)

老实说,你的查询没有意义,我很难理解你的“伟大”的标准。当然,它更新了10行,不出错。但是你真的不在乎它更新了哪10行吗?当前的
TOP
没有
ORDER BY
表明您希望SQL Server决定更新哪些行(这正是它将要做的)

要在SQL Server 2000中实现这一点(无需使用触发器),我认为您需要执行以下操作:

SET NOCOUNT ON;

SELECT TOP 10 key_column
INTO #foo
FROM dbo.myTable
ORDER BY some_logical_ordering_clause;

UPDATE dbo.MyTable
SET myBooleanColumn = 1
FROM #foo AS f
WHERE f.key_column = dbo.MyTable.key_column;

SELECT * FROM dbo.MyTable AS t
INNER JOIN #foo AS f
ON t.key_column = f.key_column;
如果需要一个简单的查询,则可以使用以下触发器:

CREATE TRIGGER dbo.upd_tr_myTable
ON dbo.myTable
FOR UPDATE
AS
BEGIN
  SET NOCOUNT ON;

  SELECT * FROM inserted;
END
GO
请注意,此触发器无法判断您是否正在执行前10个更新或其他操作,因此所有用户在执行更新时都将获得此结果集。即使您过滤if UPDATE(myBooleanColumn),其他用户仍可能更新该列


在任何情况下,您仍然需要修复update语句,以便知道要更新哪些行。(甚至可以考虑<代码> < < /Cord>子句>)

我认为这是不可能的(从来没有看到一种方法),但很有可能,正如你所知道的,创建一个TrimeGrad确实必须编写一个触发器<代码>更新< <代码> > >代码> >从插入中选择*;<代码>-但是,我还没有测试这是否会与上述行为相同。我认为这是不可能的(永远看不到方法),但正如您所知,创建触发器可能是可能的。非常确定,您必须为更新编写一个触发器
从插入中选择*-但是我还没有测试它是否与上面的行为相同。谢谢,我所说的“伟大”是指它运行时没有错误,并且比我尝试使用SET rowcount时快得多。我的查询对您没有意义,因为您不理解我使用它的上下文。我将一次又一次地调用此查询,直到选择并更新了所有行。我不需要按列排序,只要update和select语句以相同的顺序拉入即可。SQL server可以决定。在很多情况下,程序员可能需要将数据分块提取,而这正是我使用它的目的。好的,我们将在这里看到您。“同一顺序”在任何时候都可以改变,即使在同一查询的执行之间,因为如果你不使用引擎的顺序,可以考虑很多变量来确定哪个顺序是最好的。好的,谢谢,我会做不同的事情。我正在从.NET应用程序运行此查询,因此我只需将行选择到DataTable对象中,在其中设置布尔值,然后从DataTable对象运行批处理更新。什么排序问题,所有行最终都将发送,因此顺序无关紧要。那么为什么每次发送10行呢?为什么每次都要将所有10行的所有列返回给调用者呢?谢谢,我的意思是它运行时没有错误,而且比我尝试使用SET rowcount时快得多。我的查询对您没有意义,因为您不理解我使用它的上下文。我将一次又一次地调用此查询,直到选择并更新了所有行。我不需要按列排序,只要update和select语句以相同的顺序拉入即可。SQL server可以决定。在很多情况下,程序员可能需要将数据分块提取,而这正是我使用它的目的。好的,我们将在这里看到您。“同一顺序”在任何时候都可以改变,即使在同一查询的执行之间,因为如果你不使用引擎的顺序,可以考虑很多变量来确定哪个顺序是最好的。好的,谢谢,我会做不同的事情。我正在从.NET应用程序运行此查询,因此我只需将行选择到DataTable对象中,在其中设置布尔值,然后从DataTable对象运行批处理更新。什么排序问题,所有行最终都将发送,因此顺序无关紧要。那么为什么每次发送10行呢?为什么每次都要将所有10行的所有列返回给调用者?