3

우리는 우리의 SQL 서버의 테이블에 장소에 2016 데이터베이스 다음 필터링 된 인덱스를 넣어했기 때문에 UPDATE 실패 원인 :필터링 된 고유 색인 잘못된 'QUOTED_IDENTIFIER의 설정

CREATE UNIQUE NONCLUSTERED INDEX [fix_SystemPKeyExecutionOrder] ON [DataInt].[TaskMaster] 
(
    [SystemPkey] ASC, 
    [ExecutionOrder] ASC 
) 
WHERE ([ExecutionOrder] IS NOT NULL) 
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 95) 
GO 

실패 SQL 코드를 일으키는 이제 다음 오류가 표시됩니다.

UPDATE failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'. Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or filtered indexes and/or query notifications and/or XML data type methods and/or spatial index operations. [SQLSTATE 42000] (Error 1934). The step failed.

필터링 된 색인이 제거되면 코드가 완벽하게 실행됩니다.

MSDN for Index Options을 보면 QUOTED_IDENTIFIERS에 대한 정보는 없습니다.

SQL 코드의 UPDATE 문에는 값에 대한 큰 따옴표가 없습니다. 우리가 볼 수있는 유일한 따옴표는 다음과 같습니다 :

SET @ROWCOUNT = @@ROWCOUNT 

    If (@ROWCOUNT = 0) 
    BEGIN 
     RAISERROR('The "File Import" task ACTIVE_YN could not be updated to "Y". Either the task does not exist or the system "File Import To Stage" does not exist.', 16, 1) 
    END 
    ELSE 
    BEGIN 
     Print 'Successfully updated the "File Import" task ACTIVE_YN to "Y".' 
    END 

우리는 두 개의 작은 따옴표 ''로 그 따옴표 "로 변경하더라도이 코드는 여전히 같은 오류와 함께 실패

테이블 자체를. 만들었습니다 :

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

SET ANSI_PADDING ON 
GO 

CREATE TABLE [DataInt].[TaskMaster](
    [Pkey] [bigint] IDENTITY(1,1) NOT NULL, 
    [ScheduleMasterPkey] [int] NOT NULL, 
    [SystemPkey] [int] NOT NULL, 
    [SourcePkey] [int] NOT NULL, 
    [TargetPkey] [int] NOT NULL, 
    [TaskName] [varchar](255) NOT NULL, 
    [TaskTypePkey] [int] NOT NULL, 
    [Active_YN] [char](1) NOT NULL, 
    [ModifiedDate] [datetime] NULL, 
    [ModifiedBy] [varchar](100) NULL, 
    [RowVersion] [timestamp] NOT NULL, 
    [ExecutionOrder] [int] NULL, 
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED 
(
    [Pkey] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 95) ON [PRIMARY], 
CONSTRAINT [uc_TaskName] UNIQUE NONCLUSTERED 
(
    [TaskName] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 95) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

내가 생각 말했듯이, 코드의 전체는 우리가 필터링 된 인덱스를 생성하지 않는 경우 완벽하게 실행, 그것은 단지 인덱스 실패

. 왜 필터링 된 색인이 갑자기 SQL에 폭탄을 일으키고 어떻게 해결할 수 있습니까?

업데이트 : 여기에 오류를 재현하는 작은 조각 코드가 있습니다. 이 코드는 SQL 에이전트 작업을 통해 실행됩니다.

DECLARE @ROWCOUNT INT = 0 

UPDATE [DataIntegrationMaster].[DataInt].[TaskMaster] 
    Set Active_YN = 'Y' 
    where TaskName = 'File Import' 
    and SystemPkey = 0 

    SET @ROWCOUNT = @@ROWCOUNT 

    If (@ROWCOUNT = 0) 
    BEGIN 
     RAISERROR('The "File Import" task ACTIVE_YN could not be updated to "Y". Either the task does not exist or the system "File Import To Stage" does not exist.', 16, 1) 
    END 
    ELSE 
    BEGIN 
     Print 'Successfully updated the "File Import" task ACTIVE_YN to "Y".' 
    END 

UPDATE2 답 : 인덱스가 제거되면,이 코드는 오류를 알리는 예상대로 작업이 존재하지 않는 실행 아래의 도움이 답변에 의해 지적 , 나는

를 넣어했다
SET QUOTED_IDENTIFIER ON 

SQL의 맨 위에 제대로 작동하려면.

SET QUOTED_IDENTIFIER ON 

은 색인을 생성 할 때 효과가 없습니다.

+0

문제를 재현하는 데 사용할 수있는 최소한의 자체 포함 스크립트를 만들 수 있습니까? – sstan

+0

오류의 원인이되는 코드 스 니펫으로 질문을 업데이트했습니다. –

답변

1

있다 : 유사한 문제를 방지하기 위해 SET QUOTED_IDENTIFIER (Transact-SQL)

, 내가 필터링 된 인덱스를 생성하기위한 정확한 요구 사항을 확인하는 것이 좋습니다 : CREATE INDEX (Transact-SQL). 필터링 된 인덱스를 생성하는 데 필요한 옵션이 SET 인 멋진 테이블이 있습니다.

+0

좋은 링크 @Roger. MSDN이 OP와 연결된 페이지와 동일한 페이지에 정보를 넣을 수없는 이유가 궁금합니다. –

+0

실제로 업데이트를 수행하는 SQL의 맨 위에'SET QUOTED_IDENTIFIER ON'을 넣어야했습니다. 인덱스 생성시 SET QUOTED_IDENTIFIER ON을 설정하면 아무 효과가 없습니다. 이제 효과가 있습니다. 링크 해줘서 고마워. 그것은 MSDN 좋은 링크였습니다. 나는 그 테이블에 닿은 SP 나 다른 SQL이 명시 적으로 SET QUOTED_IDENTIFIER ON을 가져야 만한다는 것을 성가 시게 느낀다. –

+0

서버 수준에서이 옵션을 기본적으로 '켜기'로 설정하면 기존 코드에 미치는 영향을 최소화 할 수 있습니다. 이 옵션이 명시 적으로 어딘가에 'OFF'로 설정되어 있지 않으면 모든 사람이 서버 기본값을 선택합니다. –

2

@Roger Wolf의 답변에서 지적했듯이 필터링 된 색인을 만들려면 QUOTED_IDENTIFER 설정을 ON으로 설정해야합니다. 이는 사용자가 수행 한 작업입니다. 그렇게하지 않았다면 필터링 된 색인을 처음부터 만들 수 없었을 것입니다.

그러나 생성 된 후에는 해당 테이블의 모든 DML 작업 (업데이트뿐만 아니라)도 QUOTED_IDENTIFER 설정을 ON으로 설정해야합니다.이것은 현재 누락 된 부분이며 오류가 발생한 이유입니다.

이렇게 임시 문으로 실행하든이 명령이 저장 프로 시저의 일부인지 여부에 관계없이 update의 컨텍스트가 무엇인지 알 수 없습니다. 어느 쪽이든, 시작 부분에 SET QUOTED_IDENTIFIER ON 진술을 포함시켜야합니다.

+0

업데이트 해 주셔서 감사합니다. 나는 당신에게 upvoted지만, 그는 정보와의 첫 링크가 있기 때문에 @ 로저 답변 크레딧을 주었다. 당신이 말했듯이, 나는 SET QUOTED_IDENTIFIER ON을 SQL에 넣어야 만했다. 그 SQL은 정규 에이전트 작업입니다. 나는 그 테이블에 닿은 SP 나 다른 SQL이 명시 적으로 SET QUOTED_IDENTIFIER ON을 가져야 만한다는 것을 성가 시게 느낀다. –