如何在 SQL Server 中将 identity_insert 设置为 on

Joe*_*sey 5 sql-server insert t-sql identity

我得到了 command set identity_insert table_name on;,但由于某种原因,它实际上并没有改变属性。我已经使用创建表的帐户完成了它,并且我还创建了一个“管理员”帐户并授予它执行任何操作的权限(据我所知)。

每当我在任一帐户下运行命令时,我都会得到“0 行受影响”的结果,然后我无法运行查询来插入我希望插入的行,并出现以下错误:

当 IDENTITY_INSERT 设置为 OFF 时,无法为表“table_name”中的标识列插入显式值。

此外,我尝试在查询中包含架构名称,例如:

set identity_insert mySchema.table_name on; 
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

找不到对象“mySchema.table_name”,因为它不存在或您没有权限。

另外值得注意的是,我的项目看起来像:

localhost\SQLEXPRESS
-Databases
--System Databases
--mySchema
Run Code Online (Sandbox Code Playgroud)

有谁知道这个问题的解决方案?

Seb*_*ine 5

您正在使用正确的语法

SET IDENTITY_INSERT dbo.sometable ON;
Run Code Online (Sandbox Code Playgroud)

但是,SQL Server 中的架构与数据库不同

对象的默认架构dbo如我的示例中所示。如果您已连接到数据库,则不需要指定数据库名称,但您可以这样:

SET IDENTITY_INSERT DbName.dbo.sometable ON;
Run Code Online (Sandbox Code Playgroud)

似乎没有办法获得当前设置,因为它是session-scoped 而不是 persisted

如果您在数据库中运行此查询,它将返回其中所有表的完全限定名称:

SELECT 
    QUOTENAME(DB_NAME())+'.'+
    QUOTENAME(OBJECT_SCHEMA_NAME(object_id))+'.'+
    QUOTENAME(OBJECT_NAME(object_id)) AS FullTableName 
FROM sys.tables;
Run Code Online (Sandbox Code Playgroud)

SET IDENTITY_INSERT ON... 必须在与插入相同的会话中运行。