2016-05-10 51 views
3

我希望sql查询更新记录。例如有3列在我的表 -用于更新空值的记录的SQL查询

名称,地址,电子邮件

,当我更新任何一列其他列的值应不设置为null,他们空。像

Update tbl_Student set Name = 'XYZ' where id = 1 

在上面的情况下,只有名称列应该更新,其他列应该更新为null。

仅供参考,

由于有,我需要设置为空值,这就是为什么我想要某种查询做两个多列。像 -

ID ADDRESS  NAME  EMAIL  
1  PARK ROAD JOHN  [email protected] 

我只想更新名称,并希望该领域的其他应null.Like

Update Table SET NAME = 'NICK' WHERE ID = 1 

然后更新的输出应该是 -

ID ADDRESS  NAME  EMAIL  
1  NULL   NICK  NULL 
+0

我真的不明白这里的问题,纠正我,如果我错了,你需要更新记录的名称和设置其他为空值? – Dean

+0

什么?我是说为什么?不是很清楚你想达到什么目的。设置'address = null,email = null'也许?或触发器?请重新说明问题,并告诉我们为什么你需要它,以及明确更新列有什么问题。 – Pred

+1

然后您可以简单地删除该记录并插入一个只有一个列值的新行(从表中删除id = 1,插入表(id,name)值(1,'abc')希望你不想要在这里设置id = NULL :) –

回答

0

一个快速IDEEA那么你会希望得到两条语句:

  1. 其中一个使null为空(除了id)=>在第二个Update语句之前执行的触发器上放置一个触发器。

  2. 另一个用实际值更新所需的列。

您可以重新考虑表结构更简单的一个:

ID | Column_Name | Column_Value 

,而不是与像NULL列一个巨大的表:

ID | COLUMN_1 | COLUMN_2 | ..... | COLUMN N 
-------------------------------------------- 
2 | NULL | NULL |  | "string" 
+0

如果您知道要设置的列和其他名称,为什么要执行2个查询?运行2个查询而不是1个的好处是什么? – Pred

+0

@Pred我不能在这里提出任何有效的观点。也许他想要一些通用的,但不是通用的。 – besciualex

+0

是的你是对的我需要一些动态的设置列空。 –

0

尝试这样,

--Case-1 
If @NAME is not null 
UPDATE tbl_Student 
SET NAME = @NAME 
    ,Address = null 
    ,Email = null 
WHERE id = 1 
--Case-2 
If @Address is not null 
UPDATE tbl_Student 
SET NAME = null 
    ,Address = @Address 
    ,Email = null 
WHERE id = 1 
--Case-3 
If @Email is not null 
UPDATE tbl_Student 
SET NAME =null 
    ,Address = null 
    ,Email = @Email 
WHERE id = 1 
0

您可以创建一个为此触发。

CREATE TRIGGER [dbo].[TRG_UPD_STUDENT] ON [dbo].[tbl_Student] 
FOR UPDATE 
AS 

IF UPDATE(Name) and (inserted.name <> NULL) 
BEGIN 
    Update tbl_Student set Address = NULL, Email = NULL where id = inserted.id 
END 

IF UPDATE(Address) and (inserted.Address <> NULL) 
BEGIN 
    Update tbl_Student set name = NULL, Email = NULL where id = inserted.id 
END 

IF UPDATE(Email) and (inserted.Email <> NULL) 
BEGIN 
Update tbl_Student set name = NULL, Address = NULL where id = inserted.id 
END 
+0

递归怎么样?触发器中的“UPDATE”会触发触发器吗? (我爱英语) – Pred

+0

这就是为什么我已经提出了所有条件和条款。请看看这个。 –

+0

采取了点。 Sidenode:我删除了评论,因为列名称提到他们来自另一个查询。 – Pred

0

我的建议是,删除该记录,并插入一个新的只有列中有值的交易。因为我认为你不想将NULL设置为id(也可能是其他一些列)。

样品:

DELETE FROM tbl_Student WHERE id = 1 
INSERT INTO tbl_Student(id,Name) VALUES(1,'XYZ') --All other column will be nullable 

注: - 如果id列是IDENTITY,那么你有SET IDENTITY_INSERT

0
DECLARE @NVC_Query nvarchar(max) = '' 

SET @NVC_Query = 'UPDATE Tour_Table 
SET' 

select @NVC_Query += ' 
    ' + columns.name + ' = NULL ,' 
from sys.tables INNER JOIN 
    sys.columns 
ON tables.object_id = columns.object_id 
WHERE tables.name = 'Your table' 
    AND columns.name <> 'The only col you want to update' 

SET @NVC_Query += ' 
    your colum = your_val 
WHERE Yourcondition' 

--SELECT @NVC_Query 
EXEC SP_EXECUTESQL @NVC_Query 

使用动态SQL来管理您所要完成的任务。这将比以前的所有答案更容易