【发布时间】:2020-11-02 10:51:26
【问题描述】:
我有以下问题:早期版本的数据库使用值 '' 而不是 NULL。如果列可以为空,我现在必须将它们存在的任何地方的这些值转换为 NULL。
我试过以下代码:
BEGIN TRAN
DECLARE
@curcolumn VARCHAR(MAX),
@curtable VARCHAR(MAX);
DECLARE cursor_setnull CURSOR
FOR SELECT INFORMATION_SCHEMA.TABLES.TABLE_NAME, INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME FROM INFORMATION_SCHEMA.TABLES
JOIN INFORMATION_SCHEMA.COLUMNS ON INFORMATION_SCHEMA.TABLES.TABLE_NAME = INFORMATION_SCHEMA.COLUMNS.TABLE_NAME
WHERE INFORMATION_SCHEMA.COLUMNS.IS_NULLABLE = 'YES'
OPEN cursor_setnull
FETCH NEXT FROM cursor_setnull INTO
@curcolumn,
@curtable;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM cursor_setnull INTO
@curcolumn,
@curtable;
DECLARE @numrows INT;
DECLARE @query NVARCHAR(MAX);
set @query = 'UPDATE '+@curtable+' SET '+@curcolumn+' = NULL WHERE '+@curcolumn+' = '''''
EXEC sp_executesql @query
END;
CLOSE cursor_setnull;
DEALLOCATE cursor_setnull;
ROLLBACK
在运行时,它为每一列提供以下错误:“无效的对象名称'column_name'。
如果有人能帮我发现错误,我将不胜感激。
【问题讨论】:
-
什么版本的 SQL Server?
-
因为这需要多次更新每一行,这不是一个很好的方法。生成一次更新所有列的查询会更好。我怀疑 Larnu 要求的版本正是为了知道
STRING_AGG是否可用于此任务。 -
“我怀疑 Larnu 要求的版本正是为了知道 STRING_AGG 是否可用于此任务” 宾果游戏,@JeroenMostert。由于缺乏相反的信息,我假设“是”(尽管我也演示了如何使用
FOR XML PATH,因为不打算嵌套STRING_AGG)。
标签: sql-server loops database-cursor