2010-11-02 104 views
4

我绝不是一个SQL程序员,我正试图完成一些我很确定已经完成了一百万次的事情。SQL服务器触发器问题

我试图在每次插入新客户时在sql中自动生成一个客户编号,但是触发器(或sp?)只有在至少第一个名字,姓氏和另一个名为case编号的值为进入。如果缺少这些字段中的任何一个,则系统会生成错误。如果符合条件,系统会为该客户生成并分配一个以字母GL-开头的唯一ID,然后使用5位数字,因此客户John Doe为GL-00001,Jane Doe为GL-00002。

我很抱歉,如果我要求太多,但我基本上任何帮助一个选择插入更新的家伙而已所以在此先感谢。

+1

你可以发布触发器的代码?我们可以帮助你更快,更轻松。 – 2010-11-02 15:19:29

+0

如果其中一个字段丢失,您是否想要生成错误? – HLGEM 2010-11-02 15:42:34

回答

0

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

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

如果你打开了扳机,你会看到什么,它对生成客户号。如果您不确定此代码的工作方式,请向上发布触发器的代码。

如果您正在更改现有系统我建议你找出任何影响,改变了数据的输入工作。

例如,应用程序可能会依赖于所有的初始值的其他部分被填充,所以改变的是触发后允许添加不完整的数据,你可以inturn打破别的东西。

0

你有可能是一个独特的约束和/或不上台面设置NULL约束。

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

这里的例子语法(你需要知道的约束名称):

--disable 
ALTER TABLE customer NOCHECK CONSTRAINT your_constraint_name 

--enable 
ALTER TABLE customer CHECK CONSTRAINT your_constraint_name 

注意:如果我是你,我宁愿尝试像这样的NOT NULL列中插入虚拟值:

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

一个非常简单的方法来做到这一点是创建这类结构的表:

类型的

客户ID在这是一个主键,把它设置为身份 类型为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

Basiclly它是所有有关获取逻辑有权检查字段空白。在本地机器上测试一个测试数据库。这将有助于你做到正确。

3

如果我是在这种情况下,我想:

--Alter表(S),因此它不需要姓,名和箱号(NOT NULL)列。在将记录提交到数据库之前,处理您在应用程序端的必需字段的检查。

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

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

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

+0

除了如果其中一个字段丢失或者您的表中有不良数据,我想要生成一个错误。如果你没有输入姓氏或案例号码,你以后怎么看乔史密斯? – HLGEM 2010-11-02 15:43:50

+0

@HLGEM:1.我建议在提交给数据库之前,在应用程序一侧检查必填字段。 2.如果所需的字段丢失,我建议将所需的列设置为NOT NULL将导致错误。 – 2010-11-02 15:45:58

+0

对不起,我想你说让他们为空。 – HLGEM 2010-11-02 17:11:15