有没有办法在SQL Server中替换整个表上的sting

时间:2018-03-09 11:31:53

标签: sql-server replace null

我试图在整个表上使用替换,因为数据包含'NULLS',因为它已经被随着时间的推移被操纵以删除某些不正确的值等等,现在包含很多NULLS,我想替换所有的'对于表中的所有列,NULL'值为NULL。

我考虑过使用:

Replace(Column, 'NULL', NULL) 

我有第2 - 17列(因为1是id),但我想知道是否有人知道如何在替换语句中指定所有表或用NULL替换所有'NULL'的其他方法。

4 个答案:

答案 0 :(得分:2)

您可以创建语句

select 'update student set ' + column_name + ' = null where ' + column_name + ' = ''null'';'
from information_schema.columns
where table_name = 'student'
order by ordinal_position

答案 1 :(得分:1)

您需要分别为每个列执行此操作。

UPDATE YourTable
SET Column1 = CASE Column1 WHEN 'NULL' THEN NULL ELSE Column1 END,
SET Column2 = CASE Column2 WHEN 'NULL' THEN NULL ELSE Column2 END,
SET Column3 = CASE Column3 WHEN 'NULL' THEN NULL ELSE Column3 END,
...
SET Column50 = CASE Column50 WHEN 'NULL' THEN NULL ELSE Column50 END;

请注意,REPLACE(Column1, 'NULL', NULL)不起作用。第三个参数不接受 NULL 作为值。另外,您期望该表达式对'Nullify'

等值执行什么操作

编辑:如果需要,添加动态脚本:

DECLARE @SQL nvarchar(MAX);

SELECT @SQL = N'UPDATE [YourTable]' + NCHAR(10) +
              STUFF((SELECT N',' + NCHAR(10) + N'SET ' + QUOTENAME(c.[name]) + N' = CASE ' + QUOTENAME(c.[name]) + N' WHEN ''NULL'' THEN NULL ELSE ' + QUOTENAME(c.[name]) + N' END'
                     FROM sys.tables t
                          JOIN sys.columns c ON t.object_id = c.object_id
                          JOIN sys.types ct ON c.user_type_id = ct.user_type_id
                     WHERE t.[name] = 'YourTable'
                     AND ct.[name] IN ('varchar','nvarchar','char','nchar')),1,2,'') + ';'

PRINT @SQL;
--EXEC sp_executesql @SQL;

答案 2 :(得分:0)

hacky方法是编写一个UPDATE语句,将每个包含'NULL'的列值设置为null,否则将其设置为原始值,例如:

UPDATE SomeTable
SET 
    Col2= case col2 when 'NULL' then NULL esle Col2 END,
    Col3= case col3 when 'NULL' then NULL esle Col3 END,
    ...
WHERE Col2 = 'NULL or Col3='NULL' or ...

这很麻烦,因为每次加载数据时都必须重复它。数据库不是Excel表格,没有"搜索并替换所有单元格"。没有细胞可以开始。

解决此问题的正确方法是修复导入脚本,以便将NULL字符串作为NULL值处理。

如果你不能这样做,你可以在表格中添加一个INSTEAD OF触发器,以便'NULL'字符串替换为NULL值,例如:

CREATE TRIGGER Insert_Cleanup ON dbo.SomeTable    
INSTEAD OF INSERT
AS
    SET NOCOUNT ON

INSERT INTO dbo.SomeTable(Col1, Col2, ....., ColN)
  SELECT 
      Col1, 
      case col2 when 'NULL' then NULL esle Col2 END,
      case col3 when 'NULL' then NULL esle Col3 END,
      ...
  FROM 
      INSERTED

答案 3 :(得分:0)

这应该更新数据库中所有可以为空的char列。

--Get all tables to update
DECLARE @Tables TABLE (TableName VARCHAR(MAX))
INSERT INTO @Tables
SELECT DISTINCT Table_Name FROM INFORMATION_SCHEMA.COLUMNS 

DECLARE @TableName VARCHAR(MAX)
DECLARE @SQL NVARCHAR(4000)       

--Loop though tables
WHILE EXISTS(SELECT * FROM @Tables)
BEGIN

    SELECT TOP 1 @TableName = TableName FROM @Tables

    PRINT @TableName

    SET @SQL = NULL

    --Construct the update statement using the columns from information_schema        
    SELECT @SQL = COALESCE(@SQL +',','') + '[' + COLUMN_NAME + '] = CASE WHEN CAST([' + COLUMN_NAME + '] AS VARCHAR(MAX)) = ''NULL'' THEN NULL ELSE [' + COLUMN_NAME + '] END ' 
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE Table_Name = @TableName AND (select columnproperty(object_id(@TableName),COLUMN_NAME,'IsIdentity')) = 0 AND is_nullable = 'YES' AND DATA_TYPE LIKE '%char%'      

    SET @SQL = 'UPDATE [' + @TableName + '] SET ' + @SQL

    PRINT @SQL

    IF NOT @SQL IS NULL
    BEGIN
        --Execute the update statement
        EXECUTE sp_executesql @Statement = @SQL
    END
    ELSE
    BEGIN
        PRINT 'NOTHING TO UPDATE'
    END

    DELETE FROM @Tables WHERE @TableName = TableName

END