우리는 우리의 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
은 색인을 생성 할 때 효과가 없습니다.
문제를 재현하는 데 사용할 수있는 최소한의 자체 포함 스크립트를 만들 수 있습니까? – sstan
오류의 원인이되는 코드 스 니펫으로 질문을 업데이트했습니다. –