В моем SQL Server 2017 есть следующая таблица:
CREATE TABLE [dbo].[sync_versions](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[id_device_type] [bigint] NOT NULL,
[version_stamp] [nvarchar](50) NOT NULL,
[update_date] [datetime2](7) NULL,
CONSTRAINT [PK_sync_versions] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[sync_versions] ADD DEFAULT (getdate()) FOR [update_date]
GO
ALTER TABLE [dbo].[sync_versions] WITH CHECK ADD CONSTRAINT [FK_sync_versions_device_type] FOREIGN KEY([id_device_type])
REFERENCES [dbo].[device_types] ([id])
GO
ALTER TABLE [dbo].[sync_versions] CHECK CONSTRAINT [FK_sync_versions_device_type]
GO
В настоящее время таблица не содержит данных. Однако следующий запрос ничего не возвращает.
select isnull([version_stamp],'0x0000000000000001') as [version_stamp]
from [dbo].[sync_versions]
where [id_device_type] = 2;
Я ожидал, что этот запрос вернет 0x0000000000000001, я ошибаюсь? Если да, то есть ли альтернативный метод возврата значения по умолчанию, если таблица не содержит данных?
С уважением.
NULL по-прежнему является ценностью; просто неизвестный. Таким образом, отсутствие каких-либо значений - это не то же самое, что NULL.
Что касается version_stamp, что вы пытаетесь сделать? SQL Server имеет тип версия строки для обработки сценариев оптимистичного параллелизма и отслеживание изменений для поиска строк, измененных по сравнению с предыдущей версией. Отслеживание изменений также может обрабатывать удаления





Если таблица не содержит данных, вы получите 0 строк. Итак, вам нужно обернуть ваш запрос:
ISNULL(
(select [version_stamp]
from [dbo].[sync_versions]
where [id_device_type] = 2),
'0x0000000000000001')
У вас есть дублированный ', также мне нужно поместить ( и ) вокруг SELECT, чтобы это сработало.
top 1 безопаснее не использовать. Если по какой-либо причине имеется несколько совпадающих строк, это вызовет ошибку запроса, а не выберет произвольную строку. Ни одно из этих действий не является точным совпадением с исходным (который вернет несколько строк), но по умолчанию громкий сбой безопаснее, чем молчаливый сбой.
@JeroenMostert имеет смысл
Если таблица не содержит данных, вы не получите ни строк, ни даже NULL. Так работает SQL, а не особенность SQL Server. Почему вы хотите изменить то, что возвращается? Как вы собираетесь отличать фактические значения NULL от отсутствия результатов?