如何在 Apache nifi 中执行一个 Begin-End Transact SQL 语句?

问题描述

我正在尝试使用 Apache Nifi 中的执行 sql 处理器执行带有开始 - 结束和光标的 sql 语句。但这会引发一个错误,告诉“无法执行 sql 选择查询”。如何在 nifi 中执行事务 sql 语句?哪种处理器最适合这种情况?

下面是我试图执行的 sql 代码片段,

DECLARE @Cursor CURSOR
DECLARE @stlsn binary(10),@endlsn binary(10),@sequal binary(10),@op char,@upm varbinary(128),@rn numeric,@tg char(10),@ti char(10),@ln char(10),@dv char(10),@cid int

BEGIN
    SET @Cursor = CURSOR FOR
    SELECT * FROM cdc.dbo_SampleDB_CT  

    OPEN @Cursor 
    FETCH NEXT FROM @Cursor INTO @stlsn,@endlsn,@sequal,@op,@upm,@rn,@tg,@ti,@ln,@dv,@cid

    WHILE @@FETCH_STATUS = 0
    BEGIN
        SELECT @op,@dv
        IF @op= 1 Execute ('DELETE FROM dbo.NewDB WHERE RNo = '+@rn)
        IF @op= 2 Execute ('INSERT INTO dbo.NewDB VALUES ('+@rn+','''+@tg+''','''+@ti+''','''+@ln+''','''+@dv+''')')

      FETCH NEXT FROM @Cursor INTO @stlsn,@cid
    END;

    CLOSE @Cursor ;
    DEALLOCATE @Cursor;
END;

解决方法

这根本不需要是动态的。你可以只做一个连接的 DELETE 和一个 INSERT...SELECT...

你没有指定你的列名,所以我在这里猜测一下。

DELETE FROM n
FROM dbo.NewDB n
JOIN cdc.dbo_SampleDB_CT c ON c.RNo = n.RNo
WHERE c.__$operation = 1;

INSERT INTO dbo.NewDB
SELECT c.RNo,c.tg,c.ti,c.ln,c.dv
FROM cdc.dbo_SampleDB_CT c
WHERE  c.__$operation = 2;

我注意到您没有处理过 CDC 更新行。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...