我试图在整个表上使用替换,因为数据包含'NULLS',因为它已经被随着时间的推移被操纵以删除某些不正确的值等等,现在包含很多NULLS,我想替换所有的'对于表中的所有列,NULL'值为NULL。
我考虑过使用:
Replace(Column, 'NULL', NULL)
我有第2 - 17列(因为1是id),但我想知道是否有人知道如何在替换语句中指定所有表或用NULL替换所有'NULL'的其他方法。
答案 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