如何隐藏触发器的结果?
是否有SET NORESULTS ON?或者类似的?
我有一个而不是插入触发器,我有2个像这样的选择
SELECT * INTO #tmpFinal FROM INSERTED WHERE pID is not NULL
SELECT * INTO #tmp FROM INSERTED WHERE pID is NULL
问题是当我在执行INSERT时触发结果窗口中的触发器时,我看到从触发器中选择的结果...
我想禁止类似于SET NOCOUNT ON / OFF为rowcount做什么
这可能吗?
更新
这是完整的代码
CREATE TRIGGER [dbo].[TR_eElementDef1Insert] ON [dbo].[eElementDef1]
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON
SELECT * INTO #tmpFinal FROM INSERTED WHERE pID is not NULL
SELECT * INTO #tmp FROM INSERTED WHERE pID is NULL
DECLARE rows_cursor CURSOR FOR SELECT * FROM #tmp
OPEN rows_cursor
FETCH NEXT FROM rows_cursor
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @entDef bigint
DECLARE @pID bigint
--SET @entDef = (SELECT aDefinition FROM tDefinition WHERE cDefinition=SUBSTRING('eElementDef1',2,LEN('eElementDef1')-1))
SET @entDef=1
EXEC NewInstance 0, @entDef, @pID OUTPUT
UPDATE #tmp SET pID=@pID
INSERT INTO #tmpFinal SELECT TOP 1 * FROM #tmp
DELETE TOP(1) FROM #tmp
FETCH NEXT FROM rows_cursor
END
INSERT INTO eElementDef1 SELECT * FROM #tmpFinal
drop table #tmp
drop table #tmpFinal
CLOSE rows_cursor
DEALLOCATE rows_cursor
SET NOCOUNT OFF;
END
最大的问题是pID是我的PK
NewInstance SP看起来像这样
CREATE PROCEDURE [dbo].[NewInstance]
@version bigint,
@entdef bigint,
@Identity int OUT
AS
INSERT INTO tInstanceKey (pEntityDefinition) VALUES(@entdef)
SET @Identity = SCOPE_IDENTITY()
它有插入,因此无法转换为函数....
答案 0 :(得分:1)
您没有正确使用光标,而是返回结果集的FETCH NEXT FROM行。
希望这张桌子上有一个主键。你想要添加这样的东西:
DECLARE @PK bigint
更改光标定义:
DECLARE rows_cursor CURSOR FOR SELECT PKColumn FROM #tmp
更改FETCH语句(两者):
FETCH NEXT FROM rows_cursor into @PK
并改变这些:
UPDATE #tmp SET pID=@pID WHERE PKColumn = @PK
INSERT INTO #tmpFinal SELECT * FROM #tmp where PKColumn = @PK
DELETE FROM #tmp where PKColumn = @PK
如果你有一个多列主键,显然你必须扩展所有这些,并添加更多变量。
另外,如果我们可以完全避免光标会更好 - NewInstance存储过程有多复杂,以及它在哪里使用?
基于UPDATE。你想要的是:
CREATE TRIGGER [dbo].[TR_eElementDef1Insert] ON [dbo].[eElementDef1]
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON
SELECT * INTO #tmpFinal FROM INSERTED
WHILE EXISTS (select * from #tmpFinal where pID is NULL)
BEGIN
DECLARE @entDef bigint
DECLARE @pID bigint
SET @entDef=1
EXEC NewInstance 0, @entDef, @pID OUTPUT
UPDATE TOP 1 #tmpFinal SET pID=@pID where pID is null
END
INSERT INTO eElementDef1 SELECT * FROM #tmpFinal
END