SQL服务器触发问题

时间:2010-11-02 15:17:25

标签: sql-server sql-server-2005

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

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

我很抱歉,如果我要求太多,但我基本上是一个选择插入更新的人,没有更多,所以提前感谢任何帮助。

4 个答案:

答案 0 :(得分:3)

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

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

- 如果它尚不存在,请将标识列添加到客户表中。

- 将持久计算列添加到customer表,该列将标识列格式化为所需的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

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

答案 1 :(得分:0)

那你想做什么?即使这些字段没有填充,也会生成一个客户编号?

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

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

如果您要对现有系统进行更改,我建议您找出改变数据输入方式的任何影响。

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

答案 2 :(得分:0)

您可能在表上设置了唯一约束和/或NOT NULL约束。

删除/禁用这些(例如,在设计模式下使用SQL-Server管理控制台),然后再次尝试插入数据。请记住,您可能无法在插入后启用约束,因为您在插入后违反了条件。如果您完全确定它们是不必要的,则仅禁用或重新设置约束。

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

--disable
ALTER TABLE customer NOCHECK CONSTRAINT your_constraint_name

--enable
ALTER TABLE customer CHECK CONSTRAINT your_constraint_name

警告:如果我是你,我宁愿尝试为非空列插入虚拟值,如下所示:

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

答案 3 :(得分:0)

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

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

如果这种方式不可接受并且您确实需要编写触发器,请查看以下两篇文章: http://msdn.microsoft.com/en-us/library/aa258254(SQL.80).aspx

http://www.kodyaz.com/articles/sql-trigger-example-in-sql-server-2008.aspx

基本上就是让逻辑正确检查字段是否为空。在本地计算机上试用测试数据库。这将有助于你做对。