2013-04-30 2 views
6

У меня есть Capture Change Data (CDC), активируемый на моей базе данных MS SQL 2008 и использовать следующий код для добавления нового Tabel к захвату данных:Скалярная функция fn_cdc_get_min_lsn() постоянно возвращает '0x00000000000000000000' для действительных имен таблиц?

EXEC sys.sp_cdc_enable_table 
@source_schema ='ordering', 
@source_name ='Fields', 
@role_name = NULL, 
@supports_net_changes = 0; 

Однако всякий раз, когда я пытаюсь выбрать изменения от отслеживания таблиц с помощью функции sys.fn_cdc_get_min_lsn(@TableName)

SET @Begin_LSN = sys.fn_cdc_get_min_lsn('Fields') 

Я всегда получаю нулевое значение.

Я попытался добавить имя схемы, используя следующую орфографию:

SET @Begin_LSN = sys.fn_cdc_get_min_lsn('ordering.Fields') 

, но это не помогло.

ответ

14

My mystake должен был предположить, что sys.fn_cdc_get_min_lsn() принимает имя таблицы. Я был в основном ошибочен примерами в документации MSDN, возможно, и не проверял точное значение параметров.

Оказывается, что sys.fn_cdc_get_min_lsn() принимает имя экземпляра , а не имя таблицы!

Беглый взгляд на моих текущих случаях захвата:

SELECT capture_instance FROM cdc.change_tables 

возвращает правильное имя параметра:

ordering_Fields 

Итак, следует использовать подчеркивание в качестве схемы сепаратора, а не точечную нотацию как это распространено в SQL Server.

+0

... хотя, как указывает @kevin, просто замена точки не всегда будет работать – piers7

1

Вышеуказанный ответ верен. В качестве альтернативы вы можете добавить дополнительный параметр capture_instance в ЦКЗ позволяют

EXEC sys.sp_cdc_enable_table 
@source_schema ='ordering', 
@source_name ='Fields', 
@capture_instance = 'Fields' 
@role_name = NULL, 
@supports_net_changes = 0; 

затем использовать строку capture_instance в функции min_lsn

SET @Begin_LSN = sys.fn_cdc_get_min_lsn('Fields') 

возвратит первый LSN, а не 0x00000000000000000000.

Это partiularly полезно при попытке решить ошибку «Недостаточное количество аргументов были поставлены для процедуры или функции КДЦ ...» из SQL при вызове

cdc_get_net_changes_Fields(@Begin_LSN, sys.fn_cdc_get_max_lsn(), 'all') 

который просто означает «LSN вне ожидаемого диапазона»

Смежные вопросы