diff --git a/InventoryTest/Inventory.sql b/InventoryTest/Inventory.sql new file mode 100644 index 0000000..893a698 --- /dev/null +++ b/InventoryTest/Inventory.sql @@ -0,0 +1,842 @@ +IF OBJECT_ID('dbo.[ItemProperty]', 'U') IS NOT NULL + DROP TABLE [ItemProperty] + +IF OBJECT_ID('dbo.[SubCategoryProperty]', 'U') IS NOT NULL + DROP TABLE [SubCategoryProperty] + +IF OBJECT_ID('dbo.[CategoryProperty]', 'U') IS NOT NULL + DROP TABLE [CategoryProperty] + +IF OBJECT_ID('dbo.[PropertyValue]', 'U') IS NOT NULL + DROP TABLE [PropertyValue] + +IF OBJECT_ID('ItemComponent', 'U') IS NOT NULL + DROP TABLE [ItemComponent] + +IF OBJECT_ID('dbo.[Item]', 'U') IS NOT NULL + DROP TABLE [Item] + +IF OBJECT_ID('dbo.[SubCategory]', 'U') IS NOT NULL + DROP TABLE [SubCategory] + +IF OBJECT_ID('dbo.[Category]', 'U') IS NOT NULL + DROP TABLE [Category] + +IF OBJECT_ID('dbo.[Property]', 'U') IS NOT NULL + DROP TABLE [Property] + +IF OBJECT_ID('dbo.[PropertyType]', 'U') IS NOT NULL + DROP TABLE [PropertyType] + +CREATE TABLE [PropertyType] +( + [Property Type ID] INT NOT NULL IDENTITY(1, 1), + [Property Type] VARCHAR(32) NOT NULL UNIQUE, + + PRIMARY KEY([Property Type ID]) +) + +INSERT INTO [PropertyType] ([Property Type]) VALUES ('Text') +INSERT INTO [PropertyType] ([Property Type]) VALUES ('DateTime') +INSERT INTO [PropertyType] ([Property Type]) VALUES ('Money') +INSERT INTO [PropertyType] ([Property Type]) VALUES ('Integer') + +CREATE TABLE [Category] +( + [Category ID] INT NOT NULL IDENTITY(1, 1), + [Category Name] NVARCHAR(512) NOT NULL UNIQUE, + + PRIMARY KEY([Category ID]) +) + +INSERT INTO [Category] ([Category Name]) VALUES ('Books') +INSERT INTO [Category] ([Category Name]) VALUES ('Electronics') +INSERT INTO [Category] ([Category Name]) VALUES ('Appliances') +INSERT INTO [Category] ([Category Name]) VALUES ('Kitchenware') + +CREATE TABLE [SubCategory] +( + [Sub Category ID] INT NOT NULL IDENTITY(1, 1), + [Sub Category Name] NVARCHAR(512) NOT NULL UNIQUE, + [Category ID] INT NOT NULL, + + FOREIGN KEY([Category ID]) REFERENCES [Category]([Category ID]), + PRIMARY KEY([Sub Category ID]) +) + +INSERT INTO [SubCategory]([Sub Category Name], [Category ID]) VALUES ('PCIe Cards', 2) +INSERT INTO [SubCategory]([Sub Category Name], [Category ID]) VALUES ('Laptops', 2) +INSERT INTO [SubCategory]([Sub Category Name], [Category ID]) VALUES ('Desktops', 2) +INSERT INTO [SubCategory]([Sub Category Name], [Category ID]) VALUES ('CPUs', 2) +INSERT INTO [SubCategory]([Sub Category Name], [Category ID]) VALUES ('Hard Drives', 2) +INSERT INTO [SubCategory]([Sub Category Name], [Category ID]) VALUES ('Switches', 2) +INSERT INTO [SubCategory]([Sub Category Name], [Category ID]) VALUES ('Routers', 2) +INSERT INTO [SubCategory]([Sub Category Name], [Category ID]) VALUES ('CPU Coolers', 2) +INSERT INTO [SubCategory]([Sub Category Name], [Category ID]) VALUES ('USB Devices', 2) +INSERT INTO [SubCategory]([Sub Category Name], [Category ID]) VALUES ('Oscilloscopes', 2) +INSERT INTO [SubCategory]([Sub Category Name], [Category ID]) VALUES ('Heaters', 3) +INSERT INTO [SubCategory]([Sub Category Name], [Category ID]) VALUES ('Eletric Kettles', 4) + +CREATE TABLE [Property] +( + [Property ID] INT NOT NULL IDENTITY(1, 1), + [Name] NVARCHAR(128) NOT NULL, + [Property Type ID] INT NOT NULL, + + FOREIGN KEY([Property Type ID]) REFERENCES [PropertyType]([Property Type ID]), + PRIMARY KEY([Property ID]) +) + +INSERT INTO [Property] ([Name], [Property Type ID]) VALUES ('Lanewidth', 1) +INSERT INTO [Property] ([Name], [Property Type ID]) VALUES ('Battery Watt Hours', 1) +INSERT INTO [Property] ([Name], [Property Type ID]) VALUES ('ASIN', 1) +INSERT INTO [Property] ([Name], [Property Type ID]) VALUES ('Capacity (GiB)', 4) + +CREATE TABLE [SubCategoryProperty] +( + [Sub Category Property ID] INT NOT NULL IDENTITY(1, 1), + [Sub Category ID] INT NOT NULL, + [Property ID] INT NOT NULL, + + FOREIGN KEY([Sub Category ID]) REFERENCES [SubCategory]([Sub Category ID]), + FOREIGN KEY([Property ID]) REFERENCES [Property]([Property ID]), + PRIMARY KEY([Sub Category Property ID]) +) + +INSERT INTO [SubCategoryProperty] ([Sub Category ID], [Property ID]) VALUES(1, 1) +INSERT INTO [SubCategoryProperty] ([Sub Category ID], [Property ID]) VALUES(2, 2) +INSERT INTO [SubCategoryProperty] ([Sub Category ID], [Property ID]) VALUES(5, 4) + +CREATE TABLE [CategoryProperty] +( + [Category Property ID] INT NOT NULL IDENTITY(1, 1), + [Category ID] INT NOT NULL, + [Property ID] INT NOT NULL, + + FOREIGN KEY([Category ID]) REFERENCES [Category]([Category ID]), + FOREIGN KEY([Property ID]) REFERENCES [Property]([Property ID]), + PRIMARY KEY([Category Property ID]) +) + +INSERT INTO [CategoryProperty] ([Category ID], [Property ID]) VALUES (1, 3) + +CREATE TABLE [Item] +( + [Item ID] INT NOT NULL IDENTITY(1, 1), + [Name] NVARCHAR(2048) NOT NULL, + [Value] MONEY DEFAULT 0, + [Bought For] MONEY DEFAULT 0, + [Date Aquired] DATETIME, + [Comment] NVARCHAR(3072), + [Note] NVARCHAR(3072), + [Sold For] MONEY DEFAULT 0, + [Sold] BIT DEFAULT 0, + [Date Sold] DATETIME, + [Sold To] NVARCHAR(1024), -- Maybe could point to a table of comapies, or contacts + [Category ID] INT NOT NULL, + [Sub Category ID] INT DEFAULT 0, + + FOREIGN KEY([Category ID]) REFERENCES [Category]([Category ID]), + FOREIGN KEY([Sub Category ID]) REFERENCES [SubCategory]([Sub Category ID]), + PRIMARY KEY([Item ID]) +) +-- Allows grouping items together, i.e. Alienware Desktop -> CPU, HDDs / SSDs, Motherboard, etc. +CREATE TABLE [ItemComponent] +( + [Item Component ID] INT NOT NULL IDENTITY(1, 1), + [Item ID] INT NOT NULL, + [Component Item ID] INT NOT NULL, + + FOREIGN KEY([Item ID]) REFERENCES [Item]([Item ID]), + FOREIGN KEY([Component Item ID]) REFERENCES [Item]([Item ID]), + PRIMARY KEY([Item Component ID]) +) + +CREATE TABLE [PropertyValue] +( + [Property Value ID] INT NOT NULL IDENTITY(1, 1), + [Item ID] INT NOT NULL, + [Property ID] INT NOT NULL, + [Value] NVARCHAR(2048) NOT NULL, + + FOREIGN KEY([Item ID]) REFERENCES [Item]([Item ID]), + FOREIGN KEY([Property ID]) REFERENCES [Property]([Property ID]), + PRIMARY KEY([Property Value ID]) +) +GO +/****** Object: UserDefinedFunction [dbo].[CategoryExists] Script Date: 4/13/2021 7:21:17 PM ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +CREATE FUNCTION [dbo].[CategoryExists] +( + @Category NVARCHAR(512) +) +RETURNS BIT +AS +BEGIN + + DECLARE @Exists BIT = 0 + + IF EXISTS ( SELECT 1 FROM [Category] WHERE [Category Name] = @Category ) + BEGIN + SET @Exists = 1; + END + + RETURN @Exists; +END +GO +/****** Object: UserDefinedFunction [dbo].[PropertyExists] Script Date: 4/13/2021 7:21:17 PM ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +CREATE FUNCTION [dbo].[PropertyExists] +( + @PropertyName NVARCHAR(512) +) +RETURNS BIT +AS +BEGIN + + DECLARE @Exists BIT = 0 + + IF EXISTS ( SELECT 1 FROM [Property] WHERE [Name] = @PropertyName ) + BEGIN + SET @Exists = 1; + END + + RETURN @Exists; +END +GO +/****** Object: UserDefinedFunction [dbo].[SubCategoryExists] Script Date: 4/13/2021 7:21:17 PM ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +CREATE FUNCTION [dbo].[SubCategoryExists] +( + @SubCategory NVARCHAR(512) +) +RETURNS BIT +AS +BEGIN + + DECLARE @Exists BIT = 0 + + IF EXISTS ( SELECT 1 FROM [SubCategory] WHERE [Sub Category Name] = @SubCategory ) + BEGIN + SET @Exists = 1; + END + + RETURN @Exists; +END +GO +/****** Object: UserDefinedFunction [dbo].[GetCategoryProperties] Script Date: 4/13/2021 7:21:17 PM ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +CREATE FUNCTION [dbo].[GetCategoryProperties] +( + @CategoryID INT +) +RETURNS TABLE +AS +RETURN +( + SELECT [Property].[Name], [Property].[Property ID], [Category Property ID], [PropertyType].[Property Type ID], [PropertyType].[Property Type] + FROM [CategoryProperty] + INNER JOIN [Property] ON + [Property].[Property ID] = [CategoryProperty].[Property ID] + INNER JOIN [PropertyType] ON + [Property].[Property Type ID] = [PropertyType].[Property Type ID] + WHERE [CategoryProperty].[Category ID] = @CategoryID +) +GO +/****** Object: UserDefinedFunction [dbo].[GetCategorySubCategories] Script Date: 4/13/2021 7:21:17 PM ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +CREATE FUNCTION [dbo].[GetCategorySubCategories] +( + @CategoryID INT +) +RETURNS TABLE +AS +RETURN +( + SELECT [Sub Category ID] AS ID, [Sub Category Name] AS Name + FROM [SubCategory] + WHERE [Category ID] = @CategoryID +) +GO +/****** Object: UserDefinedFunction [dbo].[GetPropertyTypes] Script Date: 4/13/2021 7:21:17 PM ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +CREATE FUNCTION [dbo].[GetPropertyTypes] +( +) +RETURNS TABLE +AS +RETURN +( + SELECT [Property Type ID], [Property Type] + FROM [PropertyType] +) +GO +/****** Object: UserDefinedFunction [dbo].[GetSubCategoryProperties] Script Date: 4/13/2021 7:21:17 PM ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +CREATE FUNCTION [dbo].[GetSubCategoryProperties] +( + @SubCategoryID INT +) +RETURNS TABLE +AS +RETURN +( + SELECT [Property].[Name], [Property].[Property ID], [Sub Category Property ID], [PropertyType].[Property Type ID], [PropertyType].[Property Type] + FROM [SubCategoryProperty] + INNER JOIN [Property] ON + [Property].[Property ID] = [SubCategoryProperty].[Property ID] + INNER JOIN [PropertyType] ON + [Property].[Property Type ID] = [PropertyType].[Property Type ID] + WHERE [SubCategoryProperty].[Sub Category ID] = @SubCategoryID +) +GO +/****** Object: StoredProcedure [dbo].[CreateCategory] Script Date: 4/13/2021 7:21:17 PM ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +CREATE PROCEDURE [dbo].[CreateCategory] + @Category NVARCHAR(512) +AS +BEGIN + -- SET NOCOUNT ON added to prevent extra result sets from + -- interfering with SELECT statements. + SET NOCOUNT, XACT_ABORT ON; + + BEGIN TRY + + BEGIN TRANSACTION; + IF dbo.CategoryExists(@Category) = 1 + BEGIN; + THROW 70000, 'Duplicate category names not allowed.', 1; + END; + + INSERT INTO [Category] ([Category Name]) VALUES (@Category) + + SELECT SCOPE_IDENTITY() AS ID + COMMIT TRANSACTION; + + END TRY + BEGIN CATCH + + IF @@TRANCOUNT > 0 + BEGIN + ROLLBACK TRANSACTION + END; + + THROW; + + END CATCH; + + SET NOCOUNT, XACT_ABORT OFF; +END +GO +/****** Object: StoredProcedure [dbo].[CreateCategoryProperty] Script Date: 4/13/2021 7:21:17 PM ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +-- ============================================= +-- Author: +-- Create date: +-- Description: +-- ============================================= +CREATE PROCEDURE [dbo].[CreateCategoryProperty] + @PropertyName NVARCHAR(128), + @PropertyTypeID INT, + @CategoryID INT +AS +BEGIN + -- SET NOCOUNT ON added to prevent extra result sets from + -- interfering with SELECT statements. + DECLARE @PropertyID INT + + SET NOCOUNT, XACT_ABORT ON; + + BEGIN TRY + + BEGIN TRANSACTION; + + INSERT INTO [Property] ([Name], [Property Type ID]) VALUES (@PropertyName, @PropertyTypeID) + + SET @PropertyID = SCOPE_IDENTITY() + + INSERT INTO [CategoryProperty] ([Category ID], [Property ID]) VALUES (@CategoryID, @PropertyID) + + COMMIT TRANSACTION; + + END TRY + BEGIN CATCH + + IF @@TRANCOUNT > 0 + BEGIN + ROLLBACK TRANSACTION + END; + + THROW; + + END CATCH; + + SET NOCOUNT, XACT_ABORT OFF; +END +GO +/****** Object: StoredProcedure [dbo].[CreateSubCategory] Script Date: 4/13/2021 7:21:17 PM ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +CREATE PROCEDURE [dbo].[CreateSubCategory] + @SubCategory NVARCHAR(512), + @CategoryID INT +AS +BEGIN + -- SET NOCOUNT ON added to prevent extra result sets from + -- interfering with SELECT statements. + + SET NOCOUNT, XACT_ABORT ON; + + BEGIN TRY + + BEGIN TRANSACTION; + IF dbo.SubCategoryExists(@SubCategory) = 1 + BEGIN; + THROW 51001, 'Duplicate sub-category names not allowed.', 1; + END; + + INSERT INTO [SubCategory] ([Sub Category Name], [Category ID]) VALUES (@SubCategory, @CategoryID) + + SELECT SCOPE_IDENTITY() AS ID + + COMMIT TRANSACTION; + + END TRY + BEGIN CATCH + + IF @@TRANCOUNT > 0 + BEGIN + ROLLBACK TRANSACTION + END; + + THROW; + + END CATCH; + + SET NOCOUNT, XACT_ABORT OFF; +END +GO +/****** Object: StoredProcedure [dbo].[CreateSubCategoryProperty] Script Date: 4/13/2021 7:21:17 PM ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +-- ============================================= +-- Author: +-- Create date: +-- Description: +-- ============================================= +CREATE PROCEDURE [dbo].[CreateSubCategoryProperty] + @PropertyName NVARCHAR(128), + @PropertyTypeID INT, + @SubCategoryID INT +AS +BEGIN + -- SET NOCOUNT ON added to prevent extra result sets from + -- interfering with SELECT statements. + DECLARE @PropertyID INT + + SET NOCOUNT, XACT_ABORT ON; + + BEGIN TRY + + BEGIN TRANSACTION; + + INSERT INTO [Property] ([Name], [Property Type ID]) VALUES (@PropertyName, @PropertyTypeID) + + SET @PropertyID = SCOPE_IDENTITY() + + INSERT INTO [SubCategoryProperty] ([Sub Category ID], [Property ID]) VALUES (@SubCategoryID, @PropertyID) + + COMMIT TRANSACTION; + + END TRY + BEGIN CATCH + + IF @@TRANCOUNT > 0 + BEGIN + ROLLBACK TRANSACTION + END; + + THROW; + + END CATCH; + + SET NOCOUNT, XACT_ABORT OFF; +END +GO +/****** Object: StoredProcedure [dbo].[DeleteCategory] Script Date: 4/13/2021 7:21:17 PM ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +CREATE PROCEDURE [dbo].[DeleteCategory] + @CategoryID INT +AS +BEGIN + -- SET NOCOUNT ON added to prevent extra result sets from + -- interfering with SELECT statements. + DECLARE @ItemIDs TABLE + ( + RowNumber INT PRIMARY KEY IDENTITY(1, 1), + ID INT + ) + DECLARE @SubCategoryIDs TABLE + ( + RowNumber INT PRIMARY KEY IDENTITY(1, 1), + ID INT + ) + DECLARE @PropertyIDs TABLE + ( + RowNumber INT PRIMARY KEY IDENTITY(1, 1), + ID INT + ) + DECLARE @RowCount INT + + SET NOCOUNT, XACT_ABORT ON; + + BEGIN TRY + + BEGIN TRANSACTION; + -- Gather all Items that are associated with this category. + INSERT INTO @ItemIDs ([ID]) + SELECT [Item ID] + FROM [Item] + WHERE [Item].[Category ID] = @CategoryID + + SET @RowCount=@@ROWCOUNT + + DECLARE @CurrentRow INT = 0 + DECLARE @ID INT + -- Clear all information about the selected items. + WHILE @CurrentRow < @RowCount + BEGIN + SET @CurrentRow = @CurrentRow + 1 + + SELECT @ID = ID FROM @ItemIDs WHERE [RowNumber] = @CurrentRow + + DELETE FROM [ItemComponent] WHERE [Item ID] = @ID + + DELETE FROM [PropertyValue] WHERE [Item ID] = @ID + + DELETE FROM [Item] WHERE [Item ID] = @ID + END + -- Gather all child categories that are associated with this category. + INSERT INTO @SubCategoryIDs ([ID]) + SELECT [Sub Category ID] + FROM [SubCategory] + WHERE [Category ID] = @CategoryID + + SET @RowCount = @@ROWCOUNT + SET @CurrentRow = 0 + + WHILE @CurrentRow < @RowCount + BEGIN + SET @CurrentRow = @CurrentRow + 1 + + SELECT @ID = ID FROM @SubCategoryIDs WHERE [RowNumber] = @CurrentRow + + INSERT INTO @PropertyIDs ([ID]) + SELECT [Property ID] + FROM [SubCategoryProperty] + WHERE [Sub Category ID] = @ID + + DELETE FROM [SubCategoryProperty] WHERE [Sub Category ID] = @ID + + DELETE FROM [SubCategory] WHERE [Sub Category ID] = @ID + END + -- Clear properties from the sub-categories that were deleted and the category that is being deleted. + INSERT INTO @PropertyIDs([ID]) + SELECT [Property ID] + FROM [CategoryProperty] + WHERE [Category ID] = @CategoryID + + DELETE FROM [CategoryProperty] WHERE [Category ID] = @CategoryID + + SELECT @RowCount = COUNT([ID]) FROM @PropertyIDs + SET @CurrentRow = 0 + + WHILE @CurrentRow < @RowCount + BEGIN + SET @CurrentRow = @CurrentRow + 1 + + SELECT @ID = ID FROM @PropertyIDs WHERE [RowNumber] = @CurrentRow + + DELETE FROM [Property] WHERE [Property ID] = @ID + END + -- Finally, delete the category entirely. + DELETE FROM [Category] WHERE [Category ID] = @CategoryID + + COMMIT TRANSACTION; + + END TRY + BEGIN CATCH + + IF @@TRANCOUNT > 0 + BEGIN + ROLLBACK TRANSACTION + END; + + THROW; + + END CATCH; + + SET NOCOUNT, XACT_ABORT OFF; +END +GO +/****** Object: StoredProcedure [dbo].[DeleteCategoryProperty] Script Date: 4/13/2021 7:21:17 PM ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +-- ============================================= +-- Author: +-- Create date: +-- Description: +-- ============================================= +CREATE PROCEDURE [dbo].[DeleteCategoryProperty] + @CategoryPropertyID INT +AS +BEGIN + -- SET NOCOUNT ON added to prevent extra result sets from + -- interfering with SELECT statements. + DECLARE @PropertyID INT + + SET NOCOUNT, XACT_ABORT ON; + + BEGIN TRY + + BEGIN TRANSACTION; + + SELECT @PropertyID = [Property ID] FROM [CategoryProperty] WHERE [Category Property ID] = @CategoryPropertyID + + DELETE FROM [CategoryProperty] WHERE [Category Property ID] = @CategoryPropertyID + + DELETE FROM [Property] WHERE [Property ID] = @PropertyID + + COMMIT TRANSACTION; + + END TRY + BEGIN CATCH + + IF @@TRANCOUNT > 0 + BEGIN + ROLLBACK TRANSACTION + END; + + THROW; + + END CATCH; + + SET NOCOUNT, XACT_ABORT OFF; +END +GO +/****** Object: StoredProcedure [dbo].[DeleteSubCategory] Script Date: 4/13/2021 7:21:17 PM ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +CREATE PROCEDURE [dbo].[DeleteSubCategory] + @SubCategoryID INT +AS +BEGIN + -- SET NOCOUNT ON added to prevent extra result sets from + -- interfering with SELECT statements. + DECLARE @ItemIDs TABLE + ( + RowNumber INT PRIMARY KEY IDENTITY(1, 1), + ID INT + ) + DECLARE @PropertyIDs TABLE + ( + RowNumber INT PRIMARY KEY IDENTITY(1, 1), + ID INT + ) + DECLARE @RowCount INT + + SET NOCOUNT, XACT_ABORT ON; + + BEGIN TRY + + BEGIN TRANSACTION; + -- Gather all Items that are associated with this sub-category. + INSERT INTO @ItemIDs ([ID]) + SELECT [Item ID] + FROM [Item] + WHERE [Item].[Sub Category ID] = @SubCategoryID + + SET @RowCount=@@ROWCOUNT + + DECLARE @CurrentRow INT = 0 + DECLARE @ID INT + -- Clear all information about the selected items. + WHILE @CurrentRow < @RowCount + BEGIN + SET @CurrentRow = @CurrentRow + 1 + + SELECT @ID = ID FROM @ItemIDs WHERE [RowNumber] = @CurrentRow + + DELETE FROM [ItemComponent] WHERE [Item ID] = @ID + + DELETE FROM [PropertyValue] WHERE [Item ID] = @ID + + DELETE FROM [Item] WHERE [Item ID] = @ID + END + -- Clear properties from the sub-categories that were deleted and the category that is being deleted. + INSERT INTO @PropertyIDs([ID]) + SELECT [Property ID] + FROM [SubCategoryProperty] + WHERE [Sub Category ID] = @SubCategoryID + + DELETE FROM [SubCategoryProperty] WHERE [Sub Category ID] = @SubCategoryID + + SELECT @RowCount = COUNT([ID]) FROM @PropertyIDs + SET @CurrentRow = 0 + + WHILE @CurrentRow < @RowCount + BEGIN + SET @CurrentRow = @CurrentRow + 1 + + SELECT @ID = ID FROM @PropertyIDs WHERE [RowNumber] = @CurrentRow + + DELETE FROM [Property] WHERE [Property ID] = @ID + END + -- Finally, delete the sub-category entirely. + DELETE FROM [SubCategory] WHERE [Sub Category ID] = @SubCategoryID + + COMMIT TRANSACTION; + + END TRY + BEGIN CATCH + + IF @@TRANCOUNT > 0 + BEGIN + ROLLBACK TRANSACTION + END; + + THROW; + + END CATCH; + + SET NOCOUNT, XACT_ABORT OFF; +END +GO +/****** Object: StoredProcedure [dbo].[DeleteSubCategoryProperty] Script Date: 4/13/2021 7:21:17 PM ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +-- ============================================= +-- Author: +-- Create date: +-- Description: +-- ============================================= +CREATE PROCEDURE [dbo].[DeleteSubCategoryProperty] + @SubCategoryPropertyID INT +AS +BEGIN + -- SET NOCOUNT ON added to prevent extra result sets from + -- interfering with SELECT statements. + DECLARE @PropertyID INT + + SET NOCOUNT, XACT_ABORT ON; + + BEGIN TRY + + BEGIN TRANSACTION; + + SELECT @PropertyID = [Property ID] FROM [SubCategoryProperty] WHERE [Sub Category Property ID] = @SubCategoryPropertyID + + DELETE FROM [SubCategoryProperty] WHERE [Sub Category Property ID] = @SubCategoryPropertyID + + DELETE FROM [Property] WHERE [Property ID] = @PropertyID + + COMMIT TRANSACTION; + + END TRY + BEGIN CATCH + + IF @@TRANCOUNT > 0 + BEGIN + ROLLBACK TRANSACTION + END; + + THROW; + + END CATCH; + + SET NOCOUNT, XACT_ABORT OFF; +END +GO +/****** Object: StoredProcedure [dbo].[UpdateProperty] Script Date: 4/13/2021 7:21:17 PM ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +-- ============================================= +-- Author: +-- Create date: +-- Description: +-- ============================================= +CREATE PROCEDURE [dbo].[UpdateProperty] + @PropertyID INT, + @PropertyName NVARCHAR(128), + @PropertyTypeID INT +AS +BEGIN + -- SET NOCOUNT ON added to prevent extra result sets from + -- interfering with SELECT statements. + SET NOCOUNT, XACT_ABORT ON; + + BEGIN TRY + + BEGIN TRANSACTION; + + UPDATE [Property] SET [Name] = @PropertyName, [Property Type ID] = @PropertyTypeID WHERE [Property ID] = @PropertyID + + COMMIT TRANSACTION; + + END TRY + BEGIN CATCH + + IF @@TRANCOUNT > 0 + BEGIN + ROLLBACK TRANSACTION + END; + + THROW; + + END CATCH; + + SET NOCOUNT, XACT_ABORT OFF; +END +GO \ No newline at end of file