Скалярная функция 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
- эта ошибка:
" для процедуры или функции 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'
)