重複の可能性:
ORDERBYがTSQLのVARCHAR連結と突然競合する
最近、1つのテーブルにクラスター化インデックスを作成することがわかりました。このクラスター化インデックスにより、動的SQLステートメントの結果が変更されました。テーブルにクラスター化インデックスがある場合、ステートメントは最後に提出された結果のみを返しました。クラスタ化インデックスをテーブルから削除するか、「ORDER BYフィールド番号」を削除すると、完全な結果(15フィールド)が返されます。動作の変更は、replace呼び出しに関連するクラスター化インデックス、およびbyの順序、およびサンプルステートメントでのkの宣言が1000vsmaxであることが原因でした。
クラスター化インデックスは動的SQLステートメントの動作を変更し、異なる結果または私が知らない何かを返すことができますか?コメントは大歓迎です!
-テストテーブルを作成します
USE [test]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[test](
[companyid] [int] NOT NULL,
[fieldName] [nvarchar](50) NOT NULL,
[fieldnumber] [tinyint] NOT NULL,
[Tagname] [nvarchar](15) NULL
) ON [PRIMARY]
GO
-テストデータを挿入します
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Employee Status', 1, N'<CHARACTER_1>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Admin Grouping', 2, N'<CHARACTER_2>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Department Code', 3, N'<CHARACTER_3>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Job Code', 4, N'<CHARACTER_4>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'FLSA - Exempt', 5, N'<CHARACTER_5>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Action Field 06', 6, N'<CHARACTER_6>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Action Field 07', 7, N'<CHARACTER_7>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Action Field 08', 8, N'<CHARACTER_8>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Action Field 09', 9, N'<CHARACTER_9>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Action Field 10', 10, N'<CHARACTER_10>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'ProcessLevel', 11, N'<CHARACTER_11>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Department Name', 12, N'<CHARACTER_12>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Job Title', 13, N'<CHARACTER_13>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Information Field 04', 14, N'<CHARACTER_14>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Information Field 05', 15, N'<CHARACTER_15>')
go
-テストスクリプト
declare @k nvarchar(1000) --–-or max
set @k = ''
SELECT @k = @k + REPLACE(REPLACE(TagName,'<',''),'>','') + ',' FROM test WITH (NOLOCK)
WHERE CompanyID = 1 ORDER BY fieldnumber
select @k as test_result_without_index
go
--上記のスクリプトをテストするために1つのクラスター化されたインデックスを作成します
CREATE CLUSTERED INDEX [ix-test] ON [dbo].[test]
(
[CompanyID] ASC
)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) ON [PRIMARY]
GO
--クラスター化されたインデックスで動作の変化をテストするためにnvarchar(1000)を使用するテストスクリプト
declare @k nvarchar(1000) --–-or max
set @k = ''
SELECT @k = @k + REPLACE(REPLACE(TagName,'<',''),'>','') + ',' FROM test WITH (NOLOCK)
WHERE CompanyID = 1 ORDER BY fieldnumber
select @k as test_result_with_clustered_index_varchar1000_combine
go
--nvarchar(max)を使用して動作をテストするテストスクリプトnvarchar(max)で変更なし、クラスター化されたインデックスと組み合わせる
declare @k nvarchar(Max) --–-or max
set @k = ''
SELECT @k = @k + REPLACE(REPLACE(TagName,'<',''),'>','') + ',' FROM test WITH (NOLOCK)
WHERE CompanyID = 1 ORDER BY fieldnumber
select @k as test_result_with_clustered_index_and_varcharMax__combine
go
-クラスター化されたインデックスを削除します
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[test]') AND name = N'ix-test')
DROP INDEX [ix-test] ON [dbo].[test] WITH ( ONLINE = OFF )
GO
-次に、非クラスター化インデックスを作成します
USE [test]
GO
CREATE NONCLUSTERED INDEX [ix_test] ON [dbo].[test]
(
[companyid] ASC
)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) ON [PRIMARY]
GO
--nvarchar(100)を使用して、nvarchar(100)で変更されない動作をテストするテストスクリプトをNONclusteredインデックスと組み合わせる
declare @k nvarchar(1000) --–-or max
set @k = ''
SELECT @k = @k + REPLACE(REPLACE(TagName,'<',''),'>','') + ',' FROM test WITH (NOLOCK)
WHERE CompanyID = 1 ORDER BY fieldnumber
select @k as test_result_with_nonClustered_index_and_varchar1000_combine
go