将varchar值'NULL'转换为数据类型int时转换失败。为什么?

时间:2018-03-26 14:27:16

标签: sql sql-server

我正在尝试将一个名为[Scanned]的新列添加到我的SQL Server表[master].[dbo].[TEST_concat]

然而,我收到此错误:

  

Msg 245,Level 16,State 1,Line 2
  将varchar值'NULL'转换为数据类型int时,转换失败。

代码:

SELECT TOP (11000) 
    filer_id
    ,[filerName]
    ,[ResourceName]
    ,[UniqueIdentity]
    ,[DirID]
    ,[DirsCount]
    ,[PermCount]
    ,[RowID]
    ,[ResourceType]
    ,[ResourceFlags]
    ,[Hresult]
    ,[Details]
    ,[fsid]
    ,[Protocol]
    ,[vExport]
    ,[filerType]
    ,[Error Messages]
FROM 
    [master].[dbo].[TEST_concat]

ALTER TABLE dbo.TEST_concat
ADD [Scanned] AS
    CASE WHEN [DirID] > 0 AND [DirsCount] IS NULL 
            THEN 'in Shares table, but not SortedDirectoryTree properties'
         WHEN [DirID] > 0 AND  [DirsCount] > 0 
            THEN 'Yes'
         WHEN [DirID] IS NULL AND [DirsCount] IS NULL
            THEN 'No'
         ELSE ' ' 
    END

这是我的结果与错误消息的结果:

enter image description here

结果应该用数千行填写。

1 个答案:

答案 0 :(得分:2)

将此作为答案发布,只是为了扩展一点。

首先,问题似乎是DirIDDirCount不是数据类型int,而是varchar或类似的。因此,作为数据选择的结果,有人插入了文字字符串值'NULL',而不是值 NULL 。如果您运行查询SELECT CONVERT(int, 'NULL');,您会看到OP遇到相同的错误。

因此,真正的解决方案是修复数据和数据类型。首先,您需要找到不好的价值观。这可以通过以下方式完成:

SELECT DirID, DirsCount
FROM [master].[dbo].[TEST_concat]
WHERE (TRY_CONVERT(int,DirID) IS NULL AND DirID IS NOT NULL)
   OR (TRY_CONVERT(int, DirsCount) IS NULL AND DirsCount IS NOT NULL);

我先检查这些数据。如果您对使用 NULL 更新所有这些值感到高兴,那么您会执行2个单独的UPDATE语句(您可能不需要这两个):< / p>

UPDATE [master].[dbo].[TEST_concat]
SET DirID = NULL
WHERE TRY_CONVERT(int,DirID) IS NULL AND DirID IS NOT NULL;

UPDATE [master].[dbo].[TEST_concat]
SET DirsCount = NULL
WHERE TRY_CONVERT(int,DirsCount ) IS NULL AND DirsCount IS NOT NULL;

现在我们应该考虑更正数据类型。这可以通过以下方式完成:

ALTER [master].[dbo].[TEST_concat] ALTER DirID int;
ALTER [master].[dbo].[TEST_concat] ALTER DirsCount int;

现在,您可以运行初始帖子中的其他ALTER命令。

当然,这强烈假设DirIDDirsCount应该有int(或十进制)值(如果为十进制,则将所有对int的引用替换为{ {1}},其中decimal(s,p)s是您所需的比例和精度)。如果他们可以拥有其他价值,那么这就是一条完全不同的鱼。我认为p可能会有不正确的结果,例如[DirsCount] > '0'。例如,尝试:

'a' > '0'

请注意,结果值为SELECT CASE WHEN 'a' > '0' THEN 1 ELSE 0 END;