Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 用于更新具有空值的记录的SQL查询_Sql Server_Sql Update - Fatal编程技术网

Sql server 用于更新具有空值的记录的SQL查询

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

我需要sql查询以更新记录。例如,我的表中有3列-

姓名、地址、电子邮件

当我更新任何一列时,其他列的值应该为null,而不将其设置为null。像

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

有一个简单的想法可以满足你的需求,那就是有两种说法:

  • 一个使所有内容为null(除了id)=>的语句在第二个Update语句之前执行的语句上放置一个触发器

  • 还有一个可以用实际值更新所需的列

  • 您可以重新考虑使用更简单的表结构:

    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:我已经删除了注释,因为列名提到它们来自另一个查询。