该问题的一个示例: 我的SQL数据库中有3列。
+-------------+------------------+-------------------+
| id(integer) | age(varchar(20)) | name(varchar(20)) |
+-------------+------------------+-------------------+
有100行不同的ID,年龄和名称。但是,由于许多人更新数据库,因此年龄和名称不断变化。
但是,年龄和姓名存在一些界限:
问题是一个脚本,用于检查值的更改是否在边界之内。例如,如果age = -1或Name = 1,则这些值超出范围。
现在,有一个脚本可以将*插入newtable中,其中age <0且isnumeric(age)= 0或isnumeric(name)= 0;
已编译的新表包含的数据行的值超出边界。
我想知道是否有更有效的方法在SQL中进行这种检查。另外,我正在使用microsoft sql server
,所以我想知道使用其他语言(例如C#
或python
来解决此问题是否更有效。
答案 0 :(得分:2)
您可以应用检查约束。用表名替换“ myTable”。 “ AgeCheck”和“ NameCheck”是约束的名称。 AGE是AGE列的名称。
ALTER TABLE myTable
ADD CONSTRAINT AgeCheck CHECK(AGE > 0 )
ALTER TABLE myTable
ADD CONSTRAINT NameCheck CHECK ([Name] NOT LIKE '%[^A-Z]%')
有关Create Check Constraints的更多信息
答案 1 :(得分:0)
如果要自动将无效数据插入到新表中,可以创建AFTER INSERT触发器。我已提供片段供您参考。您可以使用用于名称检查的其他逻辑来扩展它。
通常,不鼓励使用触发器,因为它们会使事务变长。如果要避免触发,则可以有一个sql agent作业来定期进行审核。
CREATE TRIGGER AfterINSERTTrigger on [Employee]
FOR INSERT
AS
BEGIN
DECLARE @Age TINYINT, @Id INT, Name VARCHAR(20);
SELECT @Id = ins.Id FROM INSERTED ins;
SELECT @Age = ins.Age FROM INSERTED ins;
SELECT @Name = ins.Name FROM INSERTED ins;
IF (@Age = 0)
BEGIN
INSERT INTO [EmployeeAudit](
[ID]
,[Name]
,[Age])
VALUES (@ID,
@Name,
@Age);
END
END
GO