Bar*_*lin 6 sql-server t-sql sql-server-2012
我是数据库的新手,事实上,我是编程的新手。我想创建一个函数或者一个存储过程(如果它有效)来为用户表的一列插入/创建默认值。在这个表中,每个注册用户都应该被分配一个userId like K16060600,格式为Kyymmddxx,其中
K对于每个userId都是常数,yy代表年份(例如162016 年),mm 代表月份,dd 代表白天,xx 是一个 00 到 99 的数字,每当添加新行/用户时,它应该从 00 递增。我怎样才能做到这一点?
我使用的是 Visual Studio 2012 和 SQL Server 2012。
一种方法是ID在用户表中添加一列,使用基于序列对象的默认值,然后添加一个计算列以使用日期转换为字符串来创建键。
要创建序列,例如:
CREATE SEQUENCE [dbo].[userid_sq]
AS [int]
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 500
CYCLE
Run Code Online (Sandbox Code Playgroud)
如果您不是 100% 确定每天的用户数量低于该数量,我不会将自己限制在 99 的值。
你每天都想要一个新鲜的周期,对吗?因此,您可以使用晚间作业/脚本强制执行它,以确保它在第二天恢复到 1 点。
ALTER SEQUENCE [dbo].[userid_sq] RESTART WITH 1;
Run Code Online (Sandbox Code Playgroud)
因此,为了说明这一点,假设我正在创建一个新表UserDetails,并且想要包含此逻辑,我可能会执行以下操作:
CREATE TABLE UserDetails (
ID INT NOT NULL DEFAULT NEXT VALUE FOR userid_sq
,Created DATETIME DEFAULT GETDATE()
,UserKey AS
'K' +
CONVERT(VARCHAR(6), Created, 12) +
RIGHT(CONVERT(VARCHAR(11), 1000 + ID), 3)
,UserName VARCHAR(50) NOT NULL
)
INSERT INTO UserDetails (UserName)
VALUES ('TestUser')
Run Code Online (Sandbox Code Playgroud)
我的表格内容是:
身份证 - 1 用户密钥 - K160531001 用户名 - 测试用户
您询问了索引,因此,忽略上面的示例是不确定的,因此不适合用作主键的事实,如果要索引计算列,则需要在数据库中持久化该列。这会将值存储到磁盘而不是作为计算的虚拟值。
ALTER TABLE table_name ALTER COLUMN computed_column_name ADD PERSISTED;
Run Code Online (Sandbox Code Playgroud)
请注意,您可以对计算列执行的操作存在各种限制,因此我恳请您阅读以下信息以获得正确的理解。
这是该文章的相关片段,也与上述示例有关:
计算列不能用作 DEFAULT 或 FOREIGN KEY 约束定义或与 NOT NULL 约束定义一起使用。但是,如果计算列值由确定性表达式定义并且索引列中允许结果的数据类型,则计算列可用作索引中的键列或用作任何 PRIMARY KEY 或 UNIQUE 约束的一部分。例如,如果表具有整数列 a 和 b,则可以对计算列 a + b 进行索引,但无法对计算列 a + DATEPART(dd, GETDATE()) 进行索引,因为该值可能会在后续调用中发生变化。
计算列不能是 INSERT 或 UPDATE 语句的目标。
| 归档时间: |
|
| 查看次数: |
1112 次 |
| 最近记录: |