【发布时间】:2018-03-26 14:27:16
【问题描述】:
我正在尝试向我的 SQL Server 表 [master].[dbo].[TEST_concat] 添加一个名为 [Scanned] 的新列。
但是,我收到此错误:
消息 245,第 16 级,状态 1,第 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
这是我的结果与错误消息的样子:
结果应该全部填写数千行。
【问题讨论】:
-
你不应该为 [Scanned] 声明一个数据类型,例如 [Scanned] varchar(50) 或类似的东西
-
@RyanWilson 如果该列是计算列,则不是,否。然而,问题似乎是
DirID或DirsCount的数据类型不是int。因此,由于(糟糕的)数据选择,有人插入了文字字符串'NULL',而不是值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'(作为字符串)而不是 NULL 数据
-
@larnu 对计算列很感兴趣,以前从未使用过。感谢您的信息。
-
@RyanWilson 他们非常有用,特别是如果他们是
PERSISTED;因为它们也可以被索引(不是PERSISTED的计算列不能被索引)。我建议查一下。 :)
标签: sql sql-server