【发布时间】:2018-01-20 06:32:38
【问题描述】:
我目前有以下查询:
WITH History AS (
SELECT
kz.*,
kz.__$operation AS operation,
map.tran_begin_time as beginT,
map.tran_end_time as endT
FROM cdc.fn_cdc_get_all_changes_dbo_EXT_GeolObject_KategZalezh(sys.fn_cdc_get_min_lsn('dbo_EXT_GeolObject_KategZalezh'), sys.fn_cdc_get_max_lsn(), 'all') AS kz
INNER JOIN [cdc].[lsn_time_mapping] map
ON kz.[__$start_lsn] = map.start_lsn
where kz.GUID_BalanceHC_Zalezh = 'DDA9AB3A-A0AF-4623-9362-0000C8C83D63'
),
UnpivotedValues AS(
SELECT guid, GUID_another, field, val, operation, beginT, endT
FROM History
UNPIVOT ( [val] FOR field IN
(
area,
oilwidthmin,
oilwidthmax,
efectivwidthmin,
efectivwidthmax,
etc...
))t
),
UnpivotedWithLastValue AS (
SELECT
*,
--Use LAG() to get the last value for the same field
LAG(val, 1) OVER (PARTITION BY guid, GUID_another, field ORDER BY BeginT) LastVal
FROM UnpivotedValues
)
SELECT * FROM UnpivotedWithLastValue WHERE val <> LastVal OR LastVal IS NULL ORDER BY guid
此查询返回已启用 CDC(更改数据捕获)的单个表的更改值。 我想创建一个存储过程,接收要取消透视的列,并将 cdc 函数(例如 cdc.fn_cdc_get_all_...)作为参数并返回结果集。
此表的结果必须合并到一个报告中。
在我的例子中,参数 1 是 cdc.fn_cdc_get_all_changes_dbo_EXT_GeolObject_KategZalezh(sys.fn_cdc_get_min_lsn('dbo_EXT_GeolObject_KategZalezh'), sys.fn_cdc_get_max_lsn(), 'all')。这是 CDC 功能。
我应该如何在结果中发送我想要的字段列表?弦如何?
另外,有没有办法不用动态SQL?动态 SQL 并不是更好的性能解决方案。
【问题讨论】:
-
您能否概述一下您期望存储过程接收(参数)和返回(数据结果集)的内容。例如。该过程应该一次在多个 CDC 表上工作(即接收表列表作为参数),还是您希望为每个 CDC 表调用一次该过程?
标签: tsql stored-procedures sql-server-2012 parameter-passing unpivot