在UPDATE语句之后返回受影响行的row_number()

时间:2014-10-29 08:58:32

标签: c# sql-server

在我的C#应用​​程序中,我正在执行多个更新查询来操作数据库表中的数据。例如。将特定字符集替换为不同的字符集,插入新字符并删除字符。当像这样的查询已经执行时,我想做两件事。获取受影响行的总行数,并获取受影响行的row_number()结果集。第一件事很简单,已经开始工作了。然而,第二件事是我还没有弄清楚的。

以下是我操作数据时可能使用的查询示例:

UPDATE myTable 
SET myColumn = STUFF(myColumn, fromCharPos, toCharPos, 
REPLACE(SUBSTRING(myColumn, fromCharPos, toCharPos), charToReplace, charReplacement)) 
WHERE LEN(myColumn) >= fromCharPos;

此查询将(在列的所有单元格上)替换为指定字符范围内的另一个字符集的字符集。

执行此查询时,我想从受影响的行中获取行号的结果集。有谁知道我怎么能实现这个?

需要考虑的一些事项:

  • 它必须在至少SERVER版本2005及更高版本上运行。
  • UPDATE语句在事务中执行

如果有任何不清楚的地方,请在下方发表评论,以便我能够改进我的问题。

编辑: 我注意到我想要实现的目标并不十分清楚。 假设我们有一组看起来像这样的数据:

34.56.44.12.33
32.44.68
45.22.66.33.77
44.42.44
66.44.22.44.45
00.22.78
43.98.34.65.33

现在我想用字符位置9到12之间的下划线替换点。这意味着只有这些行会受到查询的影响:

 34.56.44.12.33 <--
 32.44.68
 45.22.66.33.77 <--
 44.42.44
 66.44.22.44.45 <--
 00.22.78
 43.98.34.65.33 <--

我想要实现的是获取受影响行的行号结果集。在我的例子中,这将是一个像这样的结果集:

Row_number()
1
3
5
7

2 个答案:

答案 0 :(得分:0)

<强>更新

declare @table table(val varchar(500))

insert into @table values
('34.56.44.12.33'),
('32.44.68'),
('45.22.66.33.77'),
('44.42.44'),
('66.44.22.44.45'),
('00.22.78'),
('43.98.34.65.33')


--select * from @table

declare @temp table(rowid int,val varchar(500), createdate datetime)
insert into @temp 
select ROW_NUMBER () over(order by val), val, GETDATE() from @table 

declare @rowEffectedCount int = 0
--select ROW_NUMBER () over(order by val), val, GETDATE() from @table WHERE CHARINDEX( '.',val,9 ) > 0

UPDATE @table 
SET val = 
REPLACE(SUBSTRING(val, CHARINDEX( '.',val,9 ), LEN(val)), ',', '_' ) 
WHERE CHARINDEX( '.',val,9 ) > 0
set @rowEffectedCount = @@ROWCOUNT

select @rowEffectedCount roweffected ,* from @temp t1
where val not in (
select val from @table )

旧的 它的理解非常简单。

您只需添加更新查询的一个选择查询。阅读评论以了解更多

declare @rowEffectedCount int = 0

--you can use a temp table or permanet history table to take each work of portion.
--one thing to be carefull as structure is same or only save the pk , then no issue

--create table tempRowcount and insert the statement with the same where query, which filter the same data.
declare @t table(id int, createdate datetime)

select * into @t from myTable WHERE LEN(myColumn) >= fromCharPos
--or only pk
select id into @t from myTable WHERE LEN(myColumn) >= fromCharPos

--now update the 
UPDATE myTable 
SET myColumn = STUFF(myColumn, fromCharPos, toCharPos, 
REPLACE(SUBSTRING(myColumn, fromCharPos, toCharPos), charToReplace, charReplacement)) 
WHERE LEN(myColumn) >= fromCharPos;


select * from @t
--finally delete or truncate or drop the table(if you use permanent table)

答案 1 :(得分:0)

这可能对你有帮助..

CREATE TABLE #updatetablename
  (excolumn VARCHAR(100))

INSERT INTO #updatetablename
VALUES      ('34.56.44.12.33'),
            ('32.44.68'),
            ('45.22.66.33.77'),
            ('44.42.44'),
            ('66.44.22.44.45'),
            ('00.22.78'),
            ('43.98.34.65.33')

DECLARE @temp TABLE
  (excolumn VARCHAR(100))
DECLARE @temp1 TABLE
  (row_num  INT,excolumn VARCHAR(100))

INSERT INTO @temp1
SELECT Row_number()OVER (ORDER BY excolumn),*
FROM   #updatetablename

UPDATE #updatetablename
SET    excolumn = Replace(excolumn, '.', '_')
output deleted.excolumn
INTO @temp
WHERE  Len(excolumn) > 12

SELECT b.row_num AS updatedrows,
       a.excolumn
FROM   @temp a
       JOIN @temp1 b
         ON a.excolumn = b.excolumn