我正在为我们的数据库调整 fifo-stock-inventory-sql-problem,但是 SQL 代码的所有 3 个 NONCLUSTERED INDEX 部分似乎都出现错误,并且在 '(' 附近出现语法错误 [即我收到 3 个错误,所有语法错误都在 '( ' ]。我需要更改什么来消除错误?
早些时候我将 WITH 更改为 ;WITH(即添加 ; WITH 的前缀)。注释掉 3 个 NONCLUSTERED INDEX 部分中的 1 个会导致 SQL 错误从 3 次减少到 2 次。使用 SQL Server 2016 (130) 数据库。
PS:字段[TRANSTYPE]是整数类型(例如收据为1的值)
--- from https://www.red-gate.com/simple-talk/databases/sql-server/performance-sql-server/set-based-speed-phreakery-the-fifo-stock-inventory-sql-problem/
---
CREATE NONCLUSTERED INDEX [IX_Dave_General]
ON [dbo].[ICIVAL] --- RotoID IC0352 --- was [dbo].[Stock]
(
[ITEMNO] ASC, --- ascending --- was [ArticleID]
[TRANSDATE] DESC, --- descending --- was [TranDate]
[TRANSTYPE] ASC --- ascending --- was [TranCode]
)
INCLUDE ( [QUANTITY], [TRANSCOST] ) --- was ( [Items], [Price]) --- XXX Price XXX ---
;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
-----------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE NONCLUSTERED INDEX [IX_Dave_Items]
ON [dbo].[ICIVAL] --- was [dbo].[Stock]
(
[ITEMNO] ASC, --- was [ArticleID]
[TRANSDATE] ASC --- was [TranDate]
)
INCLUDE ( [QUANTITY]) --- was [Items]
WHERE ( ([TRANSTYPE] = 1) ) --- OR ([TRANSTYPE] = 5) ) --- 1 = Receipt, 2 = Rec Adjust, 3 = Rec Return, 5= Shipment Return --- was ([TranCode] IN ('IN', 'RET'))
;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
----------------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE NONCLUSTERED INDEX [IX_Dave_Price]
ON [dbo].[ICIVAL] --- was [dbo].[Stock]
(
[ITEMNO] ASC, --- was [ArticleID]
[TRANSDATE] ASC --- was [TranDate]
)
INCLUDE ( [TRANSCOST]) --- was ( [Price]) --- XXX Price XXX ---
WHERE ( [TRANSTYPE] = 1 ) --- was ([TranCode]='IN') --- 1 = Receipt, 99 = Dummy
;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 = 100)
ON [PRIMARY]
GO
---------------------------------------------------------------------------------------------------------------------------------
--- Sum up the ins and outs to calculate the remaining stock level
;WITH
cteStockSum
AS ( SELECT [ITEMNO] , --- was ArticleID without [ ] brackets
SUM(CASE WHEN [TRANSTYPE] = 5 THEN 0-[QUANTITY] --- was WHEN TranCode = 'OUT' THEN 0 - Items --- TRANSTYPE = 5 means Shipment Returns XXXXX should be Shipment
ELSE [QUANTITY] --- was ELSE Items
END) AS TotalStock
FROM [dbo].[ICIVAL] --- was dbo.Stock
GROUP BY [ITEMNO] --- was GROUP BY ArticleID
),