我正在尝试将一个名为[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
这是我的结果与错误消息的结果:
结果应该用数千行填写。
答案 0 :(得分:2)
将此作为答案发布,只是为了扩展一点。
首先,问题似乎是DirID
或DirCount
不是数据类型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
命令。
当然,这强烈假设DirID
和DirsCount
应该有int
(或十进制)值(如果为十进制,则将所有对int
的引用替换为{ {1}},其中decimal(s,p)
和s
是您所需的比例和精度)。如果他们可以拥有其他价值,那么这就是一条完全不同的鱼。我认为p
可能会有不正确的结果,例如[DirsCount] > '0'
。例如,尝试:
'a' > '0'
请注意,结果值为SELECT CASE WHEN 'a' > '0' THEN 1 ELSE 0 END;
。