sqlserver update语句怎样更改两个数据?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver update语句怎样更改两个数据?相关的知识,希望对你有一定的参考价值。

参考技术A

Update 语句用于修改表中的数据。

语法:

UPDATE table_name
SET column_name = new_value
WHERE column_name = some_value

Person:

更新某一行中的一个列

我们为last name是"Rasmussen"的人添加first name:

UPDATE Person SET FirstName = 'Nina'
WHERE LastName = 'Rasmussen'

结果:

更新某一行中的若干列 我们会修改地址(address),并添加城市名称(name of the city):  UPDATE Person SET Address = 'Stien 12', City = 'Stavanger' WHERE LastName = 'Rasmussen' 结果:

方法二:

1) mysql多表更新方法:     

MySql语法:UPDATE table_references SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition]     

例子:UPDATE A a , B b SET a.a1 = b.b1 , a.a2 = b.b2 WHERE a.a3 = b.b3    

2) SQLServer多表更新方法:    

SQLServer语法:UPDATE table_name WITH ( < table_hint_limited > [ ...n ] ) | view_name | rowset_function_limited SET column_name = expression | DEFAULT | NULL | @variable = expression | @variable = column = expression [ ,...n ] [ FROM < table_source > [ ,...n ] ] [ WHERE < search_condition > ] | [ WHERE CURRENT OF [ GLOBAL ] cursor_name | cursor_variable_name ] [ OPTION ( < query_hint > [ ,...n ] ) ]   

例子:UPDATE a SET a.a1 = b.b1 , a.a2 = b.b2 FROM A a , B b WHERE a.a3 = b.b3

返回受 UPDATE 语句影响的行数

【中文标题】返回受 UPDATE 语句影响的行数【英文标题】:Return number of rows affected by UPDATE statements 【发布时间】:2009-07-09 11:18:38 【问题描述】:

如何在存储过程 (SQL Server 2005) 中获取受 UPDATE 查询影响的行数作为结果集。例如

CREATE PROCEDURE UpdateTables
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    UPDATE Table1 Set Column = 0 WHERE Column IS NULL
    UPDATE Table2 Set Column = 0 WHERE Column IS NULL
    UPDATE Table3 Set Column = 0 WHERE Column IS NULL
    UPDATE Table4 Set Column = 0 WHERE Column IS NULL
END

然后返回:

Table1    Table2    Table3    Table4
32        45        0         3

【问题讨论】:

【参考方案1】:
CREATE PROCEDURE UpdateTables
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @RowCount1 INTEGER
    DECLARE @RowCount2 INTEGER
    DECLARE @RowCount3 INTEGER
    DECLARE @RowCount4 INTEGER

    UPDATE Table1 Set Column = 0 WHERE Column IS NULL
    SELECT @RowCount1 = @@ROWCOUNT
    UPDATE Table2 Set Column = 0 WHERE Column IS NULL
    SELECT @RowCount2 = @@ROWCOUNT
    UPDATE Table3 Set Column = 0 WHERE Column IS NULL
    SELECT @RowCount3 = @@ROWCOUNT
    UPDATE Table4 Set Column = 0 WHERE Column IS NULL
    SELECT @RowCount4 = @@ROWCOUNT

    SELECT @RowCount1 AS Table1, @RowCount2 AS Table2, @RowCount3 AS Table3, @RowCount4 AS Table4
END

【讨论】:

【参考方案2】:

这正是 SQL Server 2005 及更高版本中的 OUTPUT 子句的出色之处。

示例

CREATE TABLE [dbo].[test_table](
    [LockId] [int] IDENTITY(1,1) NOT NULL,
    [StartTime] [datetime] NULL,
    [EndTime] [datetime] NULL,
PRIMARY KEY CLUSTERED 
(
    [LockId] ASC
) ON [PRIMARY]
) ON [PRIMARY]

INSERT INTO test_table(StartTime, EndTime)
VALUES('2009 JUL 07','2009 JUL 07')
INSERT INTO test_table(StartTime, EndTime)
VALUES('2009 JUL 08','2009 JUL 08')
INSERT INTO test_table(StartTime, EndTime)
VALUES('2009 JUL 09','2009 JUL 09')
INSERT INTO test_table(StartTime, EndTime)
VALUES('2009 JUL 10','2009 JUL 10')
INSERT INTO test_table(StartTime, EndTime)
VALUES('2009 JUL 11','2009 JUL 11')
INSERT INTO test_table(StartTime, EndTime)
VALUES('2009 JUL 12','2009 JUL 12')
INSERT INTO test_table(StartTime, EndTime)
VALUES('2009 JUL 13','2009 JUL 13')

UPDATE test_table
    SET StartTime = '2011 JUL 01'
    OUTPUT INSERTED.* -- INSERTED reflect the value after the UPDATE, INSERT, or MERGE statement is completed 
WHERE
    StartTime > '2009 JUL 09'

返回以下结果

    LockId StartTime                EndTime
-------------------------------------------------------
4      2011-07-01 00:00:00.000  2009-07-10 00:00:00.000
5      2011-07-01 00:00:00.000  2009-07-11 00:00:00.000
6      2011-07-01 00:00:00.000  2009-07-12 00:00:00.000
7      2011-07-01 00:00:00.000  2009-07-13 00:00:00.000

在您的特定情况下,由于您不能对 OUTPUT 使用聚合函数,因此您需要在表变量或临时表中捕获 INSERTED.* 的输出并计算记录。例如,

DECLARE @temp TABLE (
  [LockId] [int],
  [StartTime] [datetime] NULL,
  [EndTime] [datetime] NULL 
)

UPDATE test_table
    SET StartTime = '2011 JUL 01'
    OUTPUT INSERTED.* INTO @temp
WHERE
    StartTime > '2009 JUL 09'


-- now get the count of affected records
SELECT COUNT(*) FROM @temp

【讨论】:

OUTPUT INSERTED.* INTO @temp 正是我想要的【参考方案3】:

您可能需要随时收集统计数据,但@@ROWCOUNT 捕捉到了这一点:

declare @Fish table (
Name varchar(32)
)

insert into @Fish values ('Cod')
insert into @Fish values ('Salmon')
insert into @Fish values ('Butterfish')
update @Fish set Name = 'LurpackFish' where Name = 'Butterfish'
select @@ROWCOUNT  --gives 1

update @Fish set Name = 'Dinner'
select @@ROWCOUNT -- gives 3

【讨论】:

以上是关于sqlserver update语句怎样更改两个数据?的主要内容,如果未能解决你的问题,请参考以下文章

sql 语句怎样把一列的所有值都加上一个值?

返回受 UPDATE 语句影响的行数

索引可以优化 UPDATE 语句吗?

SQL Server 2008 update语句只能更新1行数据?

SQL Server UPDATE语句的用法详解

如何用sql语句将一个字段的值加1-MS-SQLServer/疑难问题