0

有没有办法IDENTITY_INSERT ON为表值类型设置?使用表格的方式 - 不起作用。

CREATE TYPE dbo.tvp_test AS TABLE
(
    id INT NOT NULL IDENTITY(1, 1),
    a  INT NULL
);
GO

DECLARE @test dbo.tvp_test;

SET IDENTITY_INSERT @test ON;

INSERT INTO @test VALUES (1, 1);

DROP TYPE dbo.tvp_test;

错误:

消息 102,级别 15,状态 1,第 13 行
“@test”附近的语法不正确

4

2 回答 2

2

有没有办法IDENTITY_INSERT ON为表值类型设置?

TL;DR:不。


SET IDENTITY_INSERT是针对表对象使用的命令,而不是变量。SET IDENTITY_INSERT (Transact-SQL)

SET IDENTITY_INSERT (Transact-SQL)

允许将显式值插入到表的标识列中。##句法

SET IDENTITY_INSERT [ [ database_name . ] schema_name . ] table_name { ON | OFF }  

论据

database_name
是指定表所在的数据库的名称。

schema_name
是表所属的模式的名称。

table_name
是具有标识列的表的名称。

请注意,这根本没有引用变量;那是因为它不能用来对付一个人。

如果您确实需要两个版本的表类型,一个允许其 ID 列的显式值,另一个使用IDENTITY,您将需要定义 2 个表类型;一个IDENTITY有财产,另一个没有:

CREATE TYPE dbo.tvp_test_i AS TABLE (id INT NOT NULL IDENTITY(1, 1),
                                     a INT NULL);

CREATE TYPE dbo.tvp_test_ni AS TABLE (id INT NOT NULL,
                                     a INT NULL);
GO

DECLARE @i dbo.tvp_test_i;
INSERT INTO @i (a)
VALUES(17),(21);

DECLARE @ni dbo.tvp_test_ni;
INSERT INTO @ni (id,a)
VALUES(3,95),(5,34);

SELECT *
FROM @i;

SELECT *
FROM @ni;
于 2020-11-16T09:57:37.487 回答
0

You could accommodate both ids (auto-generated and/or manually specified) in the same table type with some added overhead:

CREATE TYPE dbo.tvp_test_xyz AS TABLE
(
    autoid INT NOT NULL IDENTITY(1, 1), --auto generated id
    manualid int null, --manually inserted id (filled in when needed)
    id as isnull(manualid, autoid) unique, --the final id, this is used in queries etc....
    a  INT NULL
);
GO


declare @t as dbo.tvp_test_xyz ;

--case, use autogenerated id
insert into @t(a)
select top (100) object_id
from sys.all_objects;

--id = autoid
select *
from @t;

select * from @t
where id between 10 and 20;

--case, manual id
delete from @t;

insert into @t(manualid, a)
select top (100) row_number() over(order by name desc), object_id
from sys.all_objects;

--id = manualid
select * from @t;

select * from @t
where id between 10 and 20;
于 2020-11-19T10:40:03.663 回答