如何随机更新SQL Server中具有此编码F01=1和F03=1的两行

如何随机更新SQL Server中具有此编码F01=1和F03=1的两行,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,在一个包含5行的表中,如何从其他4行中随机更新其中2行,这些行的条件为F01=1和F02=1? 我想要在代码执行后更改的行数 像这样 或 编辑 如果要在更新随机选择的行后更新行ID 您可以执行以下操作 DECLARE @Table TABLE (ID INT); ;WITH CTE AS ( SELECT TOP 30 * FROM TableName WHERE F01 = 1 AND F02 = 1 ORDER BY NEWID() ) UPDATE CTE SET C

在一个包含5行的表中,如何从其他4行中随机更新其中2行,这些行的条件为F01=1和F02=1? 我想要在代码执行后更改的行数

像这样

编辑 如果要在更新随机选择的行后更新行ID

您可以执行以下操作

 DECLARE @Table TABLE (ID INT);

;WITH CTE AS 
(
 SELECT TOP 30 *
 FROM TableName 
 WHERE F01 = 1 AND F02 = 1
 ORDER BY NEWID()
)
UPDATE CTE 
 SET ColumnName = 'NewValue'
OUTPUT inserted.ID INTO @Table(ID)

-- now select from the table variable 
SELECT * FROM @Table 

您可以使用以下脚本,但它会逐个更新它们。因此,应该执行两次脚本以更新两行

   Update T
        Set F01 = 'A'
    Output Deleted.ID
    From Test T
    Where ID IN (Select ROUND(((Max(ID) - Min(ID) -1) * RAND() + Min(ID)), 0) 
                From Test 
                Where F01 = '1' And F02 = '1')

向我们展示您的查询,一个不起作用的查询,也许这样做会更容易理解。反过来说,您不能使用子查询,因为您想按newid订购…@jarlh再看一看。“我加上我的代码,这些代码不起作用。@Farshadshavari您对问题的更改太多了,为原始问题提供的答案看起来有点不相关。如果需要的话,你应该只添加更多的内容来扩展你原来的问题。否则您应该问一个新问题。@jarlh是的,您是对的。公共表表达式中的ORDER BY?@mcl-是的,与TOP一起有效。它控制TOP选择的行,而不是显示顺序。在这种情况下,mcl的答案更好,因为OP说他希望返回更新的行的ID。据我所知,使用CTE或派生表是不可能的。@zohar使用output子句是完全可能的。@ZoharPeled问题已经编辑,原始帖子没有这个要求。
;WITH CTE AS 
(
 SELECT TOP 30 *
 FROM TableName 
 WHERE F01 = 1 AND F02 = 1
 ORDER BY NEWID()
)
UPDATE CTE 
 SET ColumnName = 'NewValue'
UPDATE t
 SET t.ColumnName = 'NewValue'
FROM (
     SELECT TOP 30 *
     FROM TableName 
     WHERE F01 = 1 AND F02 = 1
     ORDER BY NEWID()
    )t
 DECLARE @Table TABLE (ID INT);

;WITH CTE AS 
(
 SELECT TOP 30 *
 FROM TableName 
 WHERE F01 = 1 AND F02 = 1
 ORDER BY NEWID()
)
UPDATE CTE 
 SET ColumnName = 'NewValue'
OUTPUT inserted.ID INTO @Table(ID)

-- now select from the table variable 
SELECT * FROM @Table 
DECLARE @ids AS TABLE(id INT)
INSERT INTO @ids(id) SELECT TOP(2) ID FROM Chess.dbo.Sheet1$ WHERE F01 = 1 AND F02 = 1 ORDER BY NEWID()
UPDATE Chess.dbo.Sheet1$ SET F01 = 'A'
WHERE ID IN (
SELECT id
FROM @ids)
   Update T
        Set F01 = 'A'
    Output Deleted.ID
    From Test T
    Where ID IN (Select ROUND(((Max(ID) - Min(ID) -1) * RAND() + Min(ID)), 0) 
                From Test 
                Where F01 = '1' And F02 = '1')