我想创建一个SP,仅当为给定表启用了ChangeTracking时才从其获取数据.

在SP中,我拥有:

DECLARE @CHANGE_TRACKING_ENABLED BIT;
SELECT @CHANGE_TRACKING_ENABLED = is_track_columns_updated_on FROM sys.change_tracking_tables WHERE object_id = OBJECT_ID('MyTable')
if @CHANGE_TRACKING_ENABLED = 1
begin
    insert into @IDS select CT.[ID_MY_TABLE] FROM CHANGETABLE(CHANGES [MyTable], @last_change_version) as CT
end

但是,当我try 创建过程时,我遇到一个错误:

Change tracking is not enabled on table 'MyTable'.

我做错了什么?

推荐答案

由于对象绑定的工作方式,服务器正在编译整个批处理,甚至在它运行之前就失败了.

虽然您可以对不存在的表使用延迟对象解析,但如果表存在但更改跟踪关闭,则这不起作用.

您有两个 Select :

  • 使用动态SQL.可维护性较差,因为重构看不到它,但您可以将其保留在一个过程中.
DECLARE @CHANGE_TRACKING_ENABLED BIT;
SELECT @CHANGE_TRACKING_ENABLED = ct.is_track_columns_updated_on
FROM sys.change_tracking_tables ct
JOIN sys.tables t ON t.object_id = ct.object_id
JOIN sys.schemas s ON s.schema_id = t.schema_id
WHERE t.name = N'MyTable'
  AND s.name = N'dbo';

IF @CHANGE_TRACKING_ENABLED = 1
BEGIN
    INSERT @IDS (ColumnsHere)
    EXEC sp_executesql N'
    SELECT CT.ID_MY_TABLE
    FROM CHANGETABLE(CHANGES [MyTable], @last_change_version) as CT;
';
END;
  • 使用另一个存储过程.更易维护,我会推荐这个.
CREATE OR ALTER PROCEDURE dbo.GetChangeTracking_MyTable
  @last_change_version bigint
AS

SELECT CT.ID_MY_TABLE
FROM CHANGETABLE(CHANGES [MyTable], @last_change_version) as CT;
DECLARE @CHANGE_TRACKING_ENABLED BIT;
SELECT @CHANGE_TRACKING_ENABLED = ct.is_track_columns_updated_on
FROM sys.change_tracking_tables ct
JOIN sys.tables t ON t.object_id = ct.object_id
JOIN sys.schemas s ON s.schema_id = t.schema_id
WHERE t.name = N'MyTable'
  AND s.name = N'dbo';

IF @CHANGE_TRACKING_ENABLED = 1
BEGIN
    INSERT @IDS (ColumnsHere)
    EXEC dbo.GetChangeTracking_MyTable @last_change_version;
END;

Sql相关问答推荐

PG SQL中按条件聚合值

SQL是否可以计算每年的所有日期变化?

出现5次后,将所有正斜杠替换为连字符

为什么在这种情况下我不能使用LAG函数?

SQL:如何取上一年的平均值?

根据开始日期和结束日期的差异计算每天的计费

缺少日期标识

将一个数组反嵌套到另外两个数组SQL中(Athena/presto)

如何使用不重复的单个顶级字段(列)向json数组 Select 多行

DbUp for sqlserver 在 dbo 授权下为非 dbo 用户创建架构

创建定时器以更新Gridview

Snowflake中的动态SQL优化

每组使用平均值来填补缺失值的SQL

查询以查找今天和昨天的数据之间的差异以及伪列

PostgreSQL - 从同一张表中获取值

PostgreSQL:通过数组的元素从另一个表中 Select 数据,然后按顺序显示

根据开始/结束标记将 GROUP_ID 分配给行

连接表时避免重复

sql count distinct by column 和 sum false 和 true

连续日期的SQL