在UPDATE语句后返回受影响行的row_number()
本文关键字:row number 影响 语句 UPDATE 返回 | 更新日期: 2023-09-27 18:28:25
在我的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
这可能会对您有所帮助。。
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
更新
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)