Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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/7/sql-server/24.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
如何使用MSSQL在值为null的特定表中的所有列中设置0_Sql_Sql Server - Fatal编程技术网

如何使用MSSQL在值为null的特定表中的所有列中设置0

如何使用MSSQL在值为null的特定表中的所有列中设置0,sql,sql-server,Sql,Sql Server,让表名为MyTable 我当前的数据如下所示: 下面,我需要在对上表进行查询之后: 实际上,我需要在单个查询中更新值为NULL的所有列。如果希望将NULL视为0,请使用ISNULL。像这样 SELECT ISNULL(Column1,0) FROM YourTable 或者,您需要将值更新为0(如果为NULL),并保持值不变。它们在update语句中使用大小写。像这样 Update YourTable SET Column1 = CASE WHEN Column1 IS NULL THEN 0

让表名为MyTable

我当前的数据如下所示:

下面,我需要在对上表进行查询之后:


实际上,我需要在单个查询中更新值为NULL的所有列。

如果希望将NULL视为0,请使用ISNULL。像这样

SELECT ISNULL(Column1,0) FROM YourTable
或者,您需要将值更新为0(如果为NULL),并保持值不变。它们在update语句中使用大小写。像这样

Update YourTable
SET Column1 = CASE WHEN Column1 IS NULL THEN 0 ELSE Column1 END,
Column2 = CASE WHEN Column2 IS NULL THEN 0 ELSE Column2 END
对于其余的列,依此类推。或者这也是可能的

Update YourTable
    SET Column1 = ISNULL(Column1,0),
cOLUMN2 = ISNULL(Column2,0)
更新表 设置column1=合并column1,0。。。。

您可以使用类似的方法。 它很优雅,但会更新表中的所有列。巨大的表可能会杀死服务器

DECLARE @TableName sysname = 'tablename'
Declare @UptQuery varchar(max)

Select @UptQuery = stuff(T.X.query('name').value('.', 'varchar(max)'), 1, 1, '')
from 
(Select ','+name + '=ISNULL('+name+', 0)' name from
    sys.columns where object_id = object_id(@TableName) for xml path(''), type) T(X)

exec ('Update ' + @TableName + ' set ' + @UptQuery)
旧答案 它将遍历表的所有列,如果为null,则使用0更新所有内容。它有很多更新,我认为从一开始就正确地设计表更好

DECLARE @TableName sysname = 'tablename'
Declare @ColName sysname

Select name into #temp from sys.columns where object_id = object_id(@TableName)
while(0 < (Select count(1) from  #temp))
BEGIN
  SET ROWCOUNT 1
  Select @ColName = name from #temp
  SET ROWCOUNT 0
  exec('Update ' + @TableName + ' set ' + @ColName + ' = ISNULL('+@ColName+', 0) where ' + @ColName + ' is null')
  delete #temp where name = @ColName
END

更新表集合ColumnName1=0,其中ColumnName1为空


在这些列上为值0添加默认约束。我已经插入了空数据。我有19个实数列,因此需要编写19个时间大小写。请尝试最后一个,而不是Column1=ISNULLColumm1,0I宁愿使用COALESCE而不是ISNULL,因为它是ANSI SQL和可移植的。这是一个老问题。但是您确定所有列都是数字数据类型吗?为什么不只构建一个查询并执行post循环呢。这将是缓慢的,因为hellI已经添加了一个更好的方法,它首先不需要循环。应该更有效。冰,非常聪明。把一个答案标记为已接受不是很好,然后回答你自己的问题并将其标记为正确答案。
   declare @tableName varchar(30)
    set @tableName='MyTable'

    DECLARE @MakeString AS NVARCHAR(MAX)
    SELECT @MakeString= 
    (SELECT cname + ',' AS 'data()' 
    FROM ( select  COLUMN_NAME +'= isnull(['+COLUMN_NAME+'],0)' as cname from INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = @tableName
                )  as ccc
    FOR XML PATH('')) 

    SET @MakeString = LEFT(@MakeString, LEN(@MakeString) - 1)

    DECLARE @Sql AS NVARCHAR(MAX)
    set @Sql='Update '+@tableName+'
    SET '+@MakeString+''

    EXEC(@Sql);