Sql server 用于更新具有空值的记录的SQL查询
我需要sql查询以更新记录。例如,我的表中有3列- 姓名、地址、电子邮件 当我更新任何一列时,其他列的值应该为null,而不将其设置为null。像Sql server 用于更新具有空值的记录的SQL查询,sql-server,sql-update,Sql Server,Sql Update,我需要sql查询以更新记录。例如,我的表中有3列- 姓名、地址、电子邮件 当我更新任何一列时,其他列的值应该为null,而不将其设置为null。像 Update tbl_Student set Name = 'XYZ' where id = 1 在上述情况下,只有Name列应该更新,而其他列应该按null更新 仅供参考 因为有两个多的列需要设置为null,所以我需要某种查询来实现这一点。像- ID ADDRESS NAME EMAIL 1 PARK
Update tbl_Student set Name = 'XYZ' where id = 1
在上述情况下,只有Name列应该更新,而其他列应该按null更新
仅供参考
因为有两个多的列需要设置为null,所以我需要某种查询来实现这一点。像-
ID ADDRESS NAME EMAIL
1 PARK ROAD JOHN john@gmail.com
我只想更新名称,并希望其余字段为空
Update Table SET NAME = 'NICK' WHERE ID = 1
然后更新的输出应该是-
ID ADDRESS NAME EMAIL
1 NULL NICK NULL
有一个简单的想法可以满足你的需求,那就是有两种说法:
ID | Column_Name | Column_Value
而不是有一个包含空列的巨大表,如:
ID | COLUMN_1 | COLUMN_2 | ..... | COLUMN N
--------------------------------------------
2 | NULL | NULL | | "string"
试着这样,
--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
您可以为此创建触发器
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
在[dbo].[tbl_学生]上创建触发器[dbo].[TRG_UPD_学生]
更新
作为
如果更新(名称)和(inserted.Name NULL)
开始
更新tbl_学生集地址=NULL,电子邮件=NULL,其中id=inserted.id
结束
如果更新(地址)和(inserted.Address NULL)
开始
更新tbl_学生集name=NULL,Email=NULL,其中id=inserted.id
结束
如果更新(电子邮件)和(inserted.Email NULL)
开始
更新tbl_学生集name=NULL,Address=NULL,其中id=inserted.id
结束
我的建议是,删除该记录,并在事务中插入一个新记录,其中只有列have value。因为,我认为您不希望将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\u INSERT
DECLARE@NVC\u Query nvarchar(max)=''对其进行管理
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
SET@NVC\u Query='更新巡更表
设定
选择@NVC_Query+='
'+columns.name+'=NULL,'
从sys.tables内部联接
sys.columns
在tables.object\u id=columns.object\u id上
其中tables.name='您的表'
和columns.name“要更新的唯一列”
设置@NVC_Query+='
你的柱子=你的价值
你的状况如何
--选择@NVC\U查询
EXEC SP_EXECUTESQL@NVC_查询
使用动态SQL完成您要完成的任务。这比前面的所有答案都要简单得多我不太明白这里的问题,如果我错了,请纠正我,您需要的是更新记录的名称并将其他值设置为空值?什么?我是说为什么?不太清楚你想要实现什么。设置
address=null,email=null
可能吗?还是扳机?请重新表述问题,并告诉我们为什么需要它,以及显式更新列有什么问题。然后,您只需删除该记录并插入一个只有一个列值的新行(从id=1的表中删除,插入表(id,名称)值(1,'abc')。希望您不想在此处设置id=NULL:)同意@AbdulRasheed,但我仍然很好奇,为什么OP必须将所有列都设置为NULL?是否可以在这个问题中添加一些示例记录,向我们展示更新前后它们的样子?这将有助于消除围绕需求的混淆。如果您知道要设置的列和其他列的名称,为什么要执行2个查询?运行两个查询而不是一个查询有什么好处?@Pred我不能在这里提出任何有效的观点。也许他想要一些泛型的东西,但不是泛型的。是的,你是对的,我需要一些动态的东西来设置列null。递归呢?触发器中的更新是否会触发触发器?(我爱英语)这就是为什么我在所有条件下都做了一个and条款。请看这个,我明白了。Sidenode:我已经删除了注释,因为列名提到它们来自另一个查询。