Sql server SQL server触发器问题

Sql server SQL server触发器问题,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我决不是一个sql程序员,我正在努力完成一些我确信已经做过一百万次的事情 每次插入新客户时,我都试图在sql中自动生成一个客户编号,但触发器(或sp?)只有在至少输入了名字、姓氏和另一个名为case number的值时才起作用。如果缺少这些字段中的任何一个,系统将生成一个错误。如果符合标准,系统将生成并为该客户分配一个以字母GL-开头的唯一id,然后使用5位数字,这样客户John Doe将是GL-00001,Jane Doe将是GL-00002 如果我要求的太多,我很抱歉,但我基本上是一个选择插

我决不是一个sql程序员,我正在努力完成一些我确信已经做过一百万次的事情

每次插入新客户时,我都试图在sql中自动生成一个客户编号,但触发器(或sp?)只有在至少输入了名字、姓氏和另一个名为case number的值时才起作用。如果缺少这些字段中的任何一个,系统将生成一个错误。如果符合标准,系统将生成并为该客户分配一个以字母GL-开头的唯一id,然后使用5位数字,这样客户John Doe将是GL-00001,Jane Doe将是GL-00002


如果我要求的太多,我很抱歉,但我基本上是一个选择插入更新的人,仅此而已,因此提前感谢您的帮助。

那么您想做什么?即使未填充这些字段,也要生成客户编号

你看过触发器的SQL了吗?您可以在SSMS(SQL Server Management Studio)中执行此操作,方法是在对象资源管理器中转到有问题的表,展开该表,然后展开触发器

如果打开触发器,您将看到它如何生成客户编号。如果您不确定此代码是如何工作的,请发布触发器的代码

如果您正在对现有系统进行更改,我建议您找出更改数据输入方式的任何含义


例如,应用程序的其他部分可能依赖于填充的所有初始值,因此在更改触发器以允许添加不完整的数据后,您可能会中断其他内容。

您可能在表上设置了唯一约束和/或非空约束

删除/禁用这些(例如,在SQL Server管理控制台处于设计模式时),然后重试插入数据。请记住,插入后可能无法启用约束,因为插入后违反了条件。仅当您绝对确定约束是不必要的时,才禁用或重新设置约束

下面是示例语法(您需要知道约束名称):

注意:如果我是您,我宁愿尝试为not null列插入伪值,如下所示:

insert into customers select afield , 1 as dummyvalue, 2 as dummyvalue from your datasource

一种非常简单的方法是创建这种结构的表:

类型为的CustomerID,它是主键并将其设置为标识 varchar(3)类型的CustomerIDPrfix将GL-存储为默认值。 然后添加其他字段并将其设置为NOTNULL

如果这种方式不可接受,您确实需要编写触发器,请查看以下两篇文章:


基本上,检查字段是否为空是为了使逻辑正确。在本地计算机上试验测试数据库。这将有助于你把事情做好。

如果我遇到这种情况,我会:

--更改表格,使名字、姓氏和案例编号为必填(非空)列。在将记录提交到数据库之前,在应用程序端处理对必填字段的检查

--如果它不存在,请向customer表中添加一个identity列

--向客户表中添加一个持久化计算列,该列将把标识列格式化为所需的
GL-00000格式

/* Demo computed column for customer number */
create table #test (
    id int identity,
    customer_number as 'GL-' + left('00000', 5-len(cast(id as varchar(5)))) + cast(id as varchar(5)) persisted,
    name char(20)
)

insert into #test (name) values ('Joe')
insert into #test (name) values ('BobbyS')

select * from #test

drop table #test

这应该可以满足您的需求,而无需引入触发器的开销。

您可以发布触发器的代码吗?我们可以更快更简单地帮助您。如果其中一个字段丢失,您不想生成错误吗?除非如果其中一个字段丢失,我想生成错误,否则表中会有错误数据。如果你没有输入姓氏或箱号,你以后怎么去找乔·史密斯?@HLGEM:1。我建议在提交给DB之前,在应用程序端检查必填字段。2.如果缺少必填字段,我建议将必填列设置为非NULL将产生错误。很抱歉,我认为您说过要将其设置为NULL。我同意Joe的说法。我将尝试这种方法。前端只是一个基本的冷聚变表单,请求所有其他信息以及这三个所需字段。谢谢@鲍比:你介意点击复选标记将此标记为接受答案吗?谢谢
/* Demo computed column for customer number */
create table #test (
    id int identity,
    customer_number as 'GL-' + left('00000', 5-len(cast(id as varchar(5)))) + cast(id as varchar(5)) persisted,
    name char(20)
)

insert into #test (name) values ('Joe')
insert into #test (name) values ('BobbyS')

select * from #test

drop table #test