我绝不是一个sql程序员,我正在努力完成一些我确信已经做过一百万次的事情。
我每次插入新客户时都尝试在sql中自动生成客户编号,但触发器(或sp?)仅在至少输入名字,姓氏和另一个称为案例编号的值时才起作用。如果缺少任何这些字段,系统将生成错误。如果符合条件,系统将为该客户生成并分配一个唯一的ID,以字母GL-开头,然后使用5位数字,以便客户John Doe为GL-00001,Jane Doe为GL-00002。
我很抱歉,如果我要求太多,但我基本上是一个选择插入更新的人,没有更多,所以提前感谢任何帮助。
答案 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
基本上就是让逻辑正确检查字段是否为空。在本地计算机上试用测试数据库。这将有助于你做对。