问题描述
我正在尝试使用 Apache Nifi 中的执行 sql 处理器执行带有开始 - 结束和光标的 sql 语句。但这会引发一个错误,告诉“无法执行 sql 选择查询”。如何在 nifi 中执行事务 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 更新行。