Скалярная функция fn cdc get min lsn () постоянно возвращает "0x00000000000000000000" для допустимых имен таблиц?

у меня есть Change Data Capture (CDC), активированный в моей базе данных MS SQL 2008, и используйте следующий код для добавления новой табели в Data capture:

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')

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

3 ответов


мой 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.


приведенный выше ответ верен. В качестве альтернативы вы можете добавить дополнительный параметр экземпляр_отслеживания для включения cdc

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, а не 0x000000000000000000000000.

Это partiularly полезно, когда пытается решить ошибку " для процедуры или функции было представлено недостаточное количество аргументов центр контроля заболеваний..." из SQL при вызове

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

что означает "LSN вне ожидаемого диапазона"


Я знаю, что это в основном уже объяснено в этом посте, но я думал, что соберу свое вечернее путешествие по CDC

  1. эта ошибка:

" для процедуры или функции cdc было предоставлено недостаточное количество аргументов..."

вероятно, вызвано вашим низким LSN0x00

это, в свою очередь, может быть потому, что вы ввели неправильное имя экземпляра в fn_cdc_get_min_lsn.

использовать SELECT * FROM cdc.change_tables найти

наконец, убедитесь, что вы используете binary (10) для хранения LSN. Если вы используете только varbinary или binary, вы снова получаете 0x00. Это явно расплата за то, что я насмехаюсь над всеми этими нубами, используя varchar и интересно, почему их строки усекаются до одного символа.

сценарий:

declare @S binary(10)
declare @E binary(10)

SET @S = sys.fn_cdc_get_min_lsn('dbo_YourTable')
SET @E = sys.fn_cdc_get_max_lsn()

SELECT @S, @E

SELECT * 
FROM [cdc].[fn_cdc_get_net_changes_dbo_issuedToken2]
(
@S,@E,'all'
)