想象一下,我们有一张桌子:
create table MYTABLE (
id int IDENTITY(1,1)
,name varchar(10)
)
Run Code Online (Sandbox Code Playgroud)
我们必须在表中插入很多行.
有人知道当生成的标识值超过最大整数值(2 ^ 63-1)时会发生什么?
我想得到下一个自动递增的主键,在这里我理解使用T-SQL来做到这一点.所以我写了以下方法:
public int GetLastNewsID()
{
const string command = @"SELECT IDENT_CURRENT ('{0}') AS Current_Identity;";
int id = EntityModel.ExecuteStoreCommand(command, "News");
return id;
}
Run Code Online (Sandbox Code Playgroud)
但它返回-1,而现在它必须是4.
PS:当我在SQL Management Studio中执行T-SQL下面时,它返回4
USE T;
GO
SELECT IDENT_CURRENT ('NEWS') AS Current_Identity;
GO
Run Code Online (Sandbox Code Playgroud) 可以更改现有的 MSSQL 列以向该列添加自动增量选项(它是主键,但不是自动增量),而无需编写 t-sql 代码,而只是使用更改策略?
我可以用 t-sql 找到解决方案,但我需要没有它。
我正在使用SQL Server Express,我创建了这个表
CREATE TABLE inventory
(
id INT NOT NULL IDENTITY(1,1),
description nvarchar(50),
quantity int,
price money
)
Run Code Online (Sandbox Code Playgroud)
当我插入此声明时:
INSERT INTO inventory VALUES('water', 20, 1.50)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
查询和表中的列数必须匹配.[query = 3中的列数,表中的列数= 4]
当我发表这个声明时:
INSERT INTO inventory VALUES(1, 'water', 20, 1.50)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
该列无法修改.[列名= id]
我以为身份会自动增加值,所以我也不能这样做,我该如何解决?提前致谢
假设我有一张这样的产品的桌子
product | number
----------------------
aaaa | 2
bbbb | 3
cccc | 1
dddd | 4
Run Code Online (Sandbox Code Playgroud)
它有点复杂,但想法是一样的.
我需要返回这样的东西
aaaa0001
aaaa0002
bbbb0003
bbbb0004
bbbb0005
cccc0006
dddd0007
dddd0008
dddd0009
dddd0010
Run Code Online (Sandbox Code Playgroud)
我的意思是,每个产品都是列中指定的次数,最后是某种识别器.
我怎样才能做到这一点 ?
我想到了表变量,Id上有标识
DECLARE @Codigos TABLE (ID INT IDENTITY(1,1), Barra Varchar(50) NOT NULL)
Run Code Online (Sandbox Code Playgroud)
插入后,做
select rtrim(ltrim(barra)) + right('0000' + rtrim(ltrim(cast(id as varchar(10)))),4) from @Codigos
Run Code Online (Sandbox Code Playgroud)
但这意味着我必须为每个产品插入产品变量中的次数,例如
@Codigos
id | Barra
----------------
1 | aaaa
2 | aaaa
Run Code Online (Sandbox Code Playgroud)
我面临着这个问题.我怎样才能做到这一点 ?用光标?这就是我的想法,但我想知道是否有更好的选择.
原始表中最大为300行.
我的问题是,如果我并行地将两个批量插入到一个表中,SQL Server如何创建标识值?
我的意思是,如果在一个会话中我插入多行(Row1-Row2-Row3)并同时另一个会话同时插入多行(Row4-Row5-Row6),结果会是这样的?
Row1
Row2
Row3
Row4
Row5
Row6
Run Code Online (Sandbox Code Playgroud)
或者这样的事情?
Row1
Row6
Row3
Row5
Row4
Row2
Run Code Online (Sandbox Code Playgroud) 查询以获取下一个身份?对于没有删除记录的表,这是可能的:
SELECT TOP 1 EMPID + 1 FROM Employee ORDER BY EMPID DESC
Run Code Online (Sandbox Code Playgroud)
如果有删除的数据,我将如何获得下一个身份?例如,我有一个这样的表:
EMPID NAME
4001 someName
4002 someName
4003 ----------------------- this is deleted
4004 someName
4005 someName
4006 someName
4007 someName
4008 someName
4009 ----------------------- this is deleted
4010 ----------------------- this is deleted
Run Code Online (Sandbox Code Playgroud)
输出必须是4011
在处理SQL Server数据库时,我发现SQL Server 2012 Enterprise Edition中的标识列值突然跳转到101.
数据库中共有10条记录(1到10).没有执行删除操作,并且在插入记录号11时,工具101.
我在浏览了一些在线帮助后找到了原因:
这件事后面还有其他原因吗?
这不起作用:
DBCC CHECKIDENT('[DMS].[dbo].[ImportedFiles]', RESEED, 0)
Run Code Online (Sandbox Code Playgroud)
插入下一条记录后,我希望种子为0而不是1.
我试过这个,但功能不喜欢它:
DBCC CHECKIDENT('[DMS].[dbo].[ImportedFiles]', RESEED, -1)
DBCC CHECKIDENT('[DMS].[dbo].[ImportedFiles]', RESEED, '-1')
Run Code Online (Sandbox Code Playgroud)
如何重置表的种子,以便下一个记录是零?(0)?