PUT parameter into IDENTITY(1,1) 属性 in SQL Table 创建脚本

PUT parameter into IDENTITY(1,1) property in SQL Table Creation script

我想设置带有参数的自定义身份,例如

CREATE TABLE Pets (
    PetId int IDENTITY(@Parameter,1) PRIMARY KEY, 
    PetName varchar(255)
    );

我的 SQL 解析器不接受这种语法。

虽然您确实需要在 CREATE TABLE 语句中使用带有 IDENTITY 的文字整数(或根本 none),但您可以在之后重置 IDENTITY 种子值您已经使用 DBCC CHECKIDENT 创建了 table, 支持参数。

还有:

  • 使用 SQL 服务器时,您应该始终 fully-qualify 对象名称及其父架构(默认为 dbo),否则可能会在不同的架构和名称中创建对象从其他模式中的对象寻址时不会被解析(它也有助于提高性能)。
  • 另外,这里有一些未经请求的数据库设计和 data-modelling 指针:
    • 一般来说,所有列都应该是 NOT NULL,除非您完全确定不是。
      • 特别是 对于文本列:没有什么比处理包含 NULL 和空白 '' 值且没有文本列更烦人的了关于两者之间是否存在任何语义差异的线索。
        • Bonus bingo:如果该列还包含 non-empty 但空白字符串。伙计们,这就是 CHECK 约束的目的!
    • 此外,烦人,如果您没有在 CREATE TABLE 列规范中指定 NOT NULLNULL,则 SQL 服务器默认假定 NULL.
  • 名称,或者实际上任何包含 human-readable 文本 的文本列通常应该是 nvarchar 而不是 varchar
    • 这不适用于其他 varchar 类型本身支持 Unicode 的 RDBMS。
    • 例外情况是使用 SQL 服务器对 UTF-8 的 oddly-implemented 支持,但那是另一个讨论。

无论如何,像这样:

CREATE TABLE dbo.Pets (
    PetId   int           NOT NULL IDENTITY PRIMARY KEY,
    PetName nvarchar(255) NOT NULL
);

GO

DBCC CHECKIDENT ( dbo.Pets, RESEED, @newIdentitySeed );
  • GO声明是为了SSMS的利益;如果您从程序代码中使用它,您可能需要将 DBCC CHECKIDENT 命令移动到单独的 command-batch.

关于权限的重要警告

  • 我假设人们会想要 运行 DBCC CHECKIDENT 重置 table 的状态以用于 运行ning 自动化集成测试或其他一些 dev/test他们拥有 sysadmindb_owner 级权限的情况,在这种情况下没有问题。
  • 但如果您没有 sysadmin (Server-level)、db_owner (DB-level) 或 db_ddladmin (DB-level ) 权限,那么您将无法使用 DBCC CHECKIDENT,即使您 可以 创建 table、DROP TABLE 原始 table 并用 as new IDENTITY 从文字重新创建它——这很愚蠢。
    • 在这种情况下,请联系您的系统管理员寻求帮助,然后 show them this page
    • 此外,请参阅 Aaron 对此答案的评论中的注释。

您可以使用动态 SQL 但这似乎不对。

DECLARE @Parameter int = 1000;

DECLARE @sql nvarchar(max) = N'CREATE TABLE dbo.Pets 
  (
    PetId int IDENTITY(' 
      + CONVERT(varchar(12), TRY_CONVERT(int,@Parameter)) 
      + ',1) PRIMARY KEY, 
    PetName varchar(255)
  );';

EXEC sys.sp_executesql @sql;