- Похоже, что в списке появляются некоторые значения NULL.
- Некоторые значения NULL отфильтровываются по запросу. Я проверил.
- Если я добавлю
AND AdditionalFields = ''
, оба этих результата будут возвращены - AdditionalFields - это varchar (max)
- База данных - это SQL Server 10 с уровнем совместимости = Sql Server 2005 (90)
- Я использую Management Studio 2008
Кажется, у меня есть пустые строки, длина которых равна NULL, или значениям NULL, равным пустой строке. Это новый тип данных?!
EDIT: Новый тип данных - таким образом, называемый "Numpty"
РЕДАКТИРОВАТЬ 2 вставка данных во временную таблицу превращает Numpies в NULLS. (Результатом этого 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), которые возвращают строки, когда поле NOT NOT и LEN (поле) IS NULL. Все эти поля были когда-то TEXT и были изменены на VARCHAR (MAX). База данных также была перенесена с Sql Server 2005 на 2008. Похоже, у нас есть ANSI_PADDING и т.д. OFF по умолчанию.
Другой пример:
Преобразование в varbinary
План выполнения: РЕДАКТИРОВАТЬ 5: удаленное определение таблицы - оказалось нецелесообразным в конце
РЕДАКТИРОВАТЬ 6 Скрипты для создания сценариев для изменения TEXT в VARCHAR (MAX), а затем обновления значений для предотвращения ошибок и повышения производительности
--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