微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为SQL中所有可为空的列设置NULL

如何解决为SQL中所有可为空的列设置NULL

我遇到以下问题:早期版本的数据库使用值”而不是NULL。如果列可以为空,我现在必须将这些值存在的所有位置都转换为NULL。

我尝试了以下代码

{{'Instagram': [datetime.time(4,28,5,322902),datetime.time(6,29,7,122295),30,8,885536),datetime.time(7,31,10,637131datetime.time(7,36,19,449087)]},{'Twitter':[datetime.time(5,37,21,179529),datetime.time(5,38,22,942552),datetime.time(20,13,629529),14,33,387693)]},{'Facebook':[datetime.time(17,15,35,188039),datetime.time(19,16,955703),datetime.time(21,387693)]}}

在运行时,它为每一列给出以下错误:“无效的对象名称'column_name'。

如果有人能为我找到错误,我将非常感激。

解决方法

如果查看生成的查询,则会发现查询不正确。

您需要更改将值提取到游标中的顺序。

FETCH NEXT FROM cursor_setnull INTO
    @curcolumn,@curtable;

应该是

FETCH NEXT FROM cursor_setnull INTO
    @curtable,@curcolumn;
,

我将不使用CURSOR,而是使用一些显式事务来批量处理全部事务。我假定 SQL Server 2017+,因为当我问您使用的是哪个版本时,缺少回复:

DECLARE @SQL nvarchar(MAX),@CRLF nchar(2) = NCHAR(13) + NCHAR(10);

DECLARE @Delimiter nvarchar(10) = N',' + @CRLF + N'    ' 

SET @SQL = STUFF((SELECT @CRLF + N'BEGIN TRANSACTION;' + @CRLF +
                         N'    UPDATE ' + QUOTENAME(s.[name]) + N'.' + QUOTENAME(t.[name]) + @CRLF + 
                         N'    SET ' + (SELECT STRING_AGG(QUOTENAME(c.[name]) + N' = CASE ' + QUOTENAME(c.[name]) + N' WHEN '''' THEN NULL ELSE '+ QUOTENAME(c.[name]) + N' END',@Delimiter) WITHIN GROUP (ORDER BY c.column_id)
                                        FROM sys.columns c
                                             JOIN sys.types ct ON c.system_type_id = ct.system_type_id
                                        WHERE c.object_id = t.object_id
                                          AND ct.[name] IN ('varchar','nvarchar','char','nchar')
                                          AND c.is_nullable = 1
                                          AND c.is_computed = 0) + N';' + @CRLF + 
                        N'COMMIT TRANSACTION'
                  FROM sys.schemas s
                       JOIN sys.tables t ON s.schema_id = t.SCHEMA_ID
                  WHERE EXISTS (SELECT 1
                                FROM sys.columns c
                                     JOIN sys.types ct ON c.system_type_id = ct.system_type_id
                                WHERE c.object_id = t.object_id
                                AND ct.[name] IN ('varchar','nchar')
                                AND c.is_nullable = 1
                                AND c.is_computed = 0)
                  ORDER BY s.schema_id,t.object_id
                  FOR XML PATH(N''),TYPE).value('(./text())[1]','nvarchar(MAX)'),1,2,N'');

PRINT @SQL; --Your best friend

--EXEC sys.sp_executesql @SQL; --Uncomment to run dynamic statement.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。