2016-08-09 7 views
0

SQL Server 2008 R2データベースサーバーでは、データをテーブルに挿入しようとしますが、INSERTステートメントのOUTPUT句はテーブルのID列に対して0のみ返します。以下のINSERT文は、単一のトランザクションで多数の文がラップされた、より大きなスクリプトの一部です。ここでSQL ServerのINSERTステートメントのOUTPUT句でID値が返されない

は声明である:

INSERT INTO CountryDivisions (
    [CountryID] 
    , [ParentDivisionID] 
    , [DivisionCodeISO] 
    , [DivisionCodeShort] 
    , [DivisionType] 
) 
    OUTPUT 
     inserted.[CountryDivisionID] -- Identity column, returning only zeros! 
     , inserted.[CountryID] 
     , inserted.[ParentDivisionID] 
     , inserted.[DivisionCodeISO] 
     , inserted.[DivisionCodeShort] 
     , inserted.[DivisionType] 
     INTO @NewCountryDivisions 
    SELECT 
     dc.[CountryID] 
     , null 
     , COALESCE(mcd.DependentDivisionCodeISO, mcd.ParentCountryAlpha2Code + '-' + mcd.DependentCountryAlpha2Code) 
     , mcd.DependentCountryAlpha2Code 
     , mcd.DependentDivisionType 
    FROM 
     @MoreCountryData AS mcd 
     JOIN Countries AS dc 
      ON dc.Alpha2Code = mcd.DependentCountryAlpha2Code 
    WHERE 
     NOT EXISTS (
      SELECT * 
      FROM CountryDivisions AS cd2 
      WHERE 
       cd2.[CountryID] = dc.[CountryID] 
       AND cd2.[DivisionCodeShort] = mcd.DependentCountryAlpha2Code 
     ) 

これは@NewCountryDivisionsから選択するときに、私が見たものである。 enter image description here

ここでは、テーブルの定義です:

CREATE TABLE [dbo].[CountryDivisions](
    [CountryDivisionID] [int] IDENTITY(1,1) NOT NULL, -- identity column which is only returning zeros! 
    [CountryID] [int] NOT NULL, 
    [ParentDivisionID] [int] NULL, 
    [DivisionCodeISO] [nvarchar](10) NULL, 
    [DivisionCodeShort] [nvarchar](10) NULL, 
    [DivisionType] [nvarchar](150) NULL, 
    [LastUpdatedBy] [sysname] NOT NULL DEFAULT (user_name()), 
    [LastUpdatedDateTime] [datetime] NOT NULL DEFAULT (getutcdate()), 
CONSTRAINT [PK_CountryDivisions_CountryDivisionID] PRIMARY KEY NONCLUSTERED 
(
    [CountryDivisionID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
) 

私が使用していますINSTEAD OFが2つのLastUpdated...の列。私は、これらの問題を引き起こすことが期待していないものの、トリガを書くには新しいですが、念のために、ここではその定義されている:私のトリガ問題だったようだ

CREATE TRIGGER [dbo].[CountryDivisions_InsertAudit] 
    ON [dbo].[CountryDivisions] 
    INSTEAD OF INSERT 
    AS 
    BEGIN 
     SET NoCount ON 

     INSERT INTO [dbo].[CountryDivisions] (
      -- I am assuming that SQL Server will apply the IDENTITY process to the [CountryDivisionID] column, so I am not inserting it myself. 
      [CountryID] 
      , [ParentDivisionID] 
      , [DivisionCodeISO] 
      , [DivisionCodeShort] 
      , [DivisionType] 
      , [LastUpdatedBy] 
      , [LastUpdatedDateTime] 
     ) 
      SELECT 
       i.CountryID 
       , i.ParentDivisionID 
       , i.DivisionCodeISO 
       , i.DivisionCodeShort 
       , i.DivisionType 
       , COALESCE(NULLIF(LTRIM(RTRIM(i.[LastUpdatedBy])), ''), USER_NAME()) 
       , COALESCE(i.[LastUpdatedDateTime], GETUTCDATE()) 
      FROM 
       inserted AS i 

    END 

CREATE TRIGGER [dbo].[CountryDivisions_UpdatAudit] 
    ON [dbo].[CountryDivisions] 
    INSTEAD OF UPDATE 
    AS 
    BEGIN 
     SET NoCount ON 

     UPDATE [dbo].[CountryDivisions] 
      SET 
       CountryID = i.CountryID 
       , ParentDivisionID = i.ParentDivisionID 
       , DivisionCodeISO = i.DivisionCodeISO 
       , DivisionCodeShort = i.DivisionCodeShort 
       , DivisionType = i.DivisionType 
       , LastUpdatedBy = COALESCE(NULLIF(LTRIM(RTRIM(i.[LastUpdatedBy])), ''), USER_NAME()) 
       , LastUpdatedDateTime = COALESCE(i.[LastUpdatedDateTime], GETUTCDATE()) 
      FROM 
       [dbo].[CountryDivisions] AS cd 
       JOIN inserted AS i 
        JOIN deleted AS d 
         ON d.CountryDivisionID = i.CountryDivisionID 
        ON cd.CountryDivisionID = i.CountryDivisionID 
      WHERE 
       -- only update records that have actually been updated. 
       i.CountryID <> d.CountryID 
       OR ISNULL(i.ParentDivisionID, -1) <> ISNULL(d.ParentDivisionID, -1) 
       OR ISNULL(i.DivisionCodeISO, '') <> ISNULL(d.DivisionCodeISO, '') 
       OR ISNULL(i.DivisionCodeShort, '') <> ISNULL(d.DivisionCodeShort, '') 
       OR (
        ISNULL(i.LastUpdatedBy, '') <> ISNULL(d.LastUpdatedBy, '') 
        AND UPDATE(LastUpdatedBy) 
       ) 
       OR (
        ISNULL(i.LastUpdatedDateTime, '1900-01-01') <> ISNULL(d.LastUpdatedDateTime, '1900-01-01') 
        AND UPDATE(LastUpdatedDateTime) 
       ) 
    END 

答えて

0

!別のスタックオーバーフローのスレッドで行われたコメントに誰かから

は、基礎となる表は INSTEAD OFトリガーが含まれてい INSERT書類に OUTPUT句は IDENTITY(seed, increment)機能で定義されたすべての列に対してのみゼロを返します。

この問題を回避するために、トリガーをAFTERというトリガーとして書き直しました。これにより、2つのトリガーを1つのトリガーに統合することもできます。

CREATE TRIGGER [dbo].[CountryDivisions_Audit] 
    ON [dbo].[CountryDivisions] 
    AFTER INSERT, UPDATE 
    AS 
    BEGIN 
     SET NoCount ON 

     -- prevent recursion 
     If TRIGGER_NESTLEVEL() > 1 RETURN 

     UPDATE cdan 
      SET 
       [LastUpdatedBy] = USER_NAME() 
       , [LastUpdatedDateTime] = GETUTCDATE() 
      FROM 
       [dbo].[CountryDivisions] AS cdan 
       JOIN inserted AS i 
        LEFT JOIN deleted AS d 
         ON d.[CountryDivisionID] = i.[CountryDivisionID] 
        ON i.[CountryDivisionID] = cdan.[CountryDivisionID] 
      WHERE 
       -- only update records that have actually been updated. 
       ISNULL(i.[CountryDivisionID], -1) <> ISNULL(d.[CountryDivisionID], -1) 
       OR ISNULL(i.[ParentDivisionID], -1) <> ISNULL(d.[ParentDivisionID], -1) 
       OR ISNULL(i.[DivisionCodeISO], '') <> ISNULL(d.[DivisionCodeISO], '') 
       OR ISNULL(i.[DivisionCodeShort], '') <> ISNULL(d.[DivisionCodeShort], '') 
       OR ISNULL(i.[DivisionType], '') <> ISNULL(d.[DivisionType], '') 
       OR (
        ISNULL(i.LastUpdatedBy, '') <> ISNULL(d.LastUpdatedBy, '') 
        AND UPDATE(LastUpdatedBy) 
       ) 
       OR (
        ISNULL(i.LastUpdatedDateTime, '1900-01-01') <> ISNULL(d.LastUpdatedDateTime, '1900-01-01') 
        AND UPDATE(LastUpdatedDateTime) 
       ) 
    END 
関連する問題