- 看起来列表中出现了一些 NULL 值。
- 查询已经过滤掉了一些 NULL 值。我已经检查过了。
- 如果我添加
AND AdditionalFields = ''
,这两个结果仍然会被返回。 - AdditionalFields 是一个 varchar(max) 类型。
- 数据库是 SQL Server 10,并且兼容级别为 Sql Server 2005 (90)。
- 我正在使用 Management Studio 2008。
我发现有一些空字符串的长度为 NULL,或者 NULL 值等于一个空字符串。这是一种新的数据类型吗?!
编辑: 新数据类型 - 特此称为“Numpty”
编辑 2: 将数据插入临时表后,Numpty 变成了 NULL。 (此 SQL 的结果为 10)
CREATE TABLE #temp(ID uniqueidentifier , Value varchar(max))
INSERT INTO #temp
SELECT top 10 g.ID, g.AdditionalFields
FROM grants g
WHERE g.AdditionalFields IS NOT NULL AND LEN(g.AdditionalFields) IS NULL
SELECT COUNT(*) FROM #temp WHERE Value is null
DROP TABLE #temp
编辑3 我可以通过运行更新来修复数据:
UPDATE Grants SET AdditionalFields = NULL
WHERE AdditionalFields IS NOT NULL AND LEN(AdditionalFields) IS NULL
所以这让我认为字段必须包含某些内容,而不是模式定义的问题。但具体是什么?我该如何防止它再次出现?
编辑4
我的数据库中还有另外2个varchar(max)字段,它们在该字段IS NOT NULL AND LEN(field) IS NULL时返回行。所有这些字段曾经都是TEXT类型,并且已更改为VARCHAR(MAX)。数据库也从Sql Server 2005移至2008. 看起来我们默认关闭了ANSI_PADDING等。另一个例子:
![进入图像描述](https://istack.dev59.com/gF7z7.webp)
![进入图像描述](https://istack.dev59.com/QnfC4.webp)
![执行计划](https://istack.dev59.com/0mfDM.webp)
--Generate scripts to alter TEXT to VARCHAR(MAX)
SELECT 'ALTER TABLE [' + tab.table_schema + '].[' + tab.table_name + '] ALTER COLUMN [' + col.column_name + '] VARCHAR(MAX)' + CASE WHEN col.IS_NULLABLE = 'YES' THEN ' NULL' ELSE ' NOT NULL' END + ' GO'
FROM INFORMATION_SCHEMA.tables tab
INNER JOIN INFORMATION_SCHEMA.COLUMNS col ON col.table_name = tab.table_name
AND tab.table_schema = col.table_schema
AND tab.table_catalog = col.table_catalog
WHERE tab.table_type <> 'VIEW' and col.DATA_TYPE = 'text'
--Generate scripts to set value to value in VARCHAR(MAX) fields
SELECT 'UPDATE [' + tab.table_schema + '].[' + tab.table_name + '] SET [' + col.column_name + '] = [' + col.column_name + ']'
FROM INFORMATION_SCHEMA.tables tab
INNER JOIN INFORMATION_SCHEMA.COLUMNS col ON col.table_name = tab.table_name
AND tab.table_schema = col.table_schema
AND tab.table_catalog = col.table_catalog
WHERE tab.table_type <> 'VIEW' AND col.DATA_TYPE = 'varchar' and col.CHARACTER_MAXIMUM_LENGTH = -1
AdditionalFields
,但在SELECT列表中没有(这将导致对另一个字段进行过滤)?类似于WHERE 'g.AdditionalFields' IS NOT NULL
的语句会产生类似的行为(因为您不是在过滤字段而是在过滤字符串常量)。 - Quassnoi