SQL Server触发器 - SET NORESULTS ON?

时间:2010-12-17 08:55:23

标签: sql-server triggers

如何隐藏触发器的结果?

是否有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()

它有插入,因此无法转换为函数....

1 个答案:

答案 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