以下是该方案。我们在一个包含压缩数据的表中有一个IMAGE
类型的列。此列可以为null。在另一个版本中,我们将此数据移动到一个单独的表中,仍然是一个图像列。
我们有一个存储过程,用于检查原始表或新表中数据的位置。为此,它将值选择到VARBINARY(MAX)
变量中,检查它是否为空,如果是,则从新表中获取它。
检查发生了一些奇怪的事情。对于数据库中的几行,该列显示为NULL
,但是当转换为VARBINARY(MAX)
时,它最终为空值0x。这仅适用于426中的4行,所有其他行评估为NULL
罚款。如果在表本身中检查null,如WHERE <column> IS NULL
,则评估为true,但如果执行WHERE CAST(<column> as VARBINARY(MAX)) IS NULL
则评估为false。
我可以更改我的存储过程以便正确处理,但我对这里发生的事情感到有些困惑。有什么想法吗?
这是在SQL Server 2005上。
***edit to try and include a clearer example
e.g.
SELECT a
FROM Table
WHERE a IS NULL
SELECT a
FROM Table
WHERE CAST(a as VARBINARY(MAX)) IS NULL
the first query returns the result with NULL, the second query doesn't return anything.
Similarily, the stored procedure looks something like this:
DECLARE @CompressedData VARBINARY(MAX)
SELECT @CompressedData = imageColumn
FROM originalTable
WHERE ID = @ID
IF (@CompressedData IS NULL)
BEGIN
SELECT @CompressedData = imageColumn
FROM newTable
WHERE ID = @ID
END
在这种情况下,@ CompressedData不会计算为NULL,因为它的值为0x