Триггер SQL Server - УСТАНОВИТЬ НОРЕСУЛЬТЫ? - PullRequest
1 голос
/ 17 декабря 2010

Как скрыть результаты от триггера?

Есть ли НАБОР НОРЕСУЛТОВ НА? или подобное?

У меня вместо триггера вставки у меня есть 2 выбора, как это

SELECT * INTO #tmpFinal FROM INSERTED WHERE pID is not NULL
SELECT * INTO #tmp FROM INSERTED WHERE pID is NULL

Проблема в том, что когда я делаю INSERT, который запускает триггер в окнах результатов, я вижу результат этих 2, выбранных из триггера ...

Я хочу запретить то, что делает SET NOCOUNT ON / OFF для счетчика строк

Возможно ли это?

UPDATE

Это полный код

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 Ответ

1 голос
/ 17 декабря 2010

Вы не используете курсор правильно, и строка 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 и где еще он используется?


На основе обновлений. То, что вы хотите, это что-то вроде:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...