В одной из ячеек в формате битов содержится более трех данных - PullRequest
1 голос
/ 10 марта 2020

Мне нужно иметь Выберите до 3 типов компаний в SQL и используйте Проверьте ограничение . Как это сделать, или я также принимаю другие предложения. Для следующей таблицы:

CREATE TABLE Dbo.[CompanyType](
    [TypeID] [bigint] IDENTITY(1,1) NOT NULL,
    [Manufacturer] [bit] NULL,
    [Trading] [bit] NULL,
    [BuyingOffice] [bit] NULL,
    [Agent] [bit] NULL,
    [Wholesaler] [bit] NULL,
    [Commission] [bit] NULL,
    [Association] [bit] NOT NULL,
    [BusinessService] [bit] NOT NULL,
    [Other] [bit] NOT NULL,
    [Photo] [image] NULL,
    [CreateDate] datetime
 CONSTRAINT [PK_CompanyType] PRIMARY KEY CLUSTERED 
(
    [TypeID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

ALTER TABLE dbo.[CompanyType] ADD  CONSTRAINT [DF_Company_PersianTax]  DEFAULT ((9)) FOR [Taxpercent]
GO

ALTER TABLE dbo.[CompanyType] ADD  CONSTRAINT [DF_Company_CreateDate]  DEFAULT (getdate()) FOR [CreateDate]
GO
  1. с использованием проверочного ограничения.

Как использовать проверить ограничение для этой модели ??

Я пробовал:

Тем временем я использую SP для вставки. Не лучше ли проверить там три или более достоверных данных? На момент ввода данных в качестве параметра проверьте
--parameter validation
if(@Manufacturer+@Trading+@BuyingOffice+@Agent+@Wholesaler+@Commission+@Association+@BusinessService+@Other)<= 3

Begin
  Return
End
else 

insert statement (...)
Использование триггера, как следующий запрос! чек вставлен, сумма столбца <= 3 отката </li>
CREATE TRIGGER usp_checksum3
   ON  dbo.companytype
   AFTER insert
AS 
BEGIN

    SET NOCOUNT ON;

     if     (Select [Manufacturer]+[Trading]+[BuyingOffice]+[Agent]+[Wholesaler]+[Commission]+[Association]+[BusinessService]+[Other] 
     From inserted) <= 3    

  Return

END

Спасибо за советы

1 Ответ

2 голосов
/ 10 марта 2020

Рассмотрите возможность использования следующего проверочного ограничения:

CREATE TABLE Dbo.[CompanyType](
    [TypeID] [bigint] IDENTITY(1,1) NOT NULL,
    [Manufacturer] [bit] NULL,
    [Trading] [bit] NULL,
    [BuyingOffice] [bit] NULL,
    [Agent] [bit] NULL,
    [Wholesaler] [bit] NULL,
    [Commission] [bit] NULL,
    [Association] [bit] NOT NULL,
    [BusinessService] [bit] NOT NULL,
    [Other] [bit] NOT NULL,
    [Photo] [image] NULL,
    [CreateDate] datetime
    CONSTRAINT [PK_CompanyType] PRIMARY KEY CLUSTERED ([TypeID] ASC)
    WITH (
        PAD_INDEX = OFF, 
        STATISTICS_NORECOMPUTE = OFF, 
        IGNORE_DUP_KEY = OFF, 
        ALLOW_ROW_LOCKS = ON, 
        ALLOW_PAGE_LOCKS = ON, 
        OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY],
    CONSTRAINT [PK_Company_Types] CHECK (
        CAST([Manufacturer] AS INT) 
        + CAST([Trading] AS INT) 
        + CAST([BuyingOffice] AS INT) 
        + CAST([Agent] AS INT)
        + CAST([Wholesaler] AS INT) 
        + CAST([Commission] AS INT)
        + CAST([Association] AS INT)
        + CAST([BusinessService] AS INT)
        + CAST([Other] AS INT)
    <= 3)

Вам не нужно реализовывать дополнительные логики c в вашей хранимой процедуре. Проверочное ограничение гарантирует целостность и применяется в равной степени к вставкам, выполненным из SP или снаружи.

Если вы хотите изменить существующую таблицу:

ALTER TABLE Dbo.[CompanyType] 
ADD CONSTRAINT [Chk_CompanyType] CHECK (
    CAST([Manufacturer] AS INT) 
    + CAST([Trading] AS INT) 
    + CAST([BuyingOffice] AS INT) 
    + CAST([Agent] AS INT)
    + CAST([Wholesaler] AS INT) 
    + CAST([Commission] AS INT)
    + CAST([Association] AS INT)
    + CAST([BusinessService] AS INT)
    + CAST([Other] AS INT)
<= 3)
...