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 NULL
或 NULL
,则 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他们拥有 sysadmin
或 db_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;
我想设置带有参数的自定义身份,例如
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
约束的目的!
- Bonus bingo:如果该列还包含 non-empty 但空白字符串。伙计们,这就是
- 特别是 对于文本列:没有什么比处理包含
- 此外,烦人,如果您没有在
CREATE TABLE
列规范中指定NOT NULL
或NULL
,则 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他们拥有sysadmin
或db_owner
级权限的情况,在这种情况下没有问题。 - 但如果您没有
sysadmin
(Server-level)、db_owner
(DB-level) 或db_ddladmin
(DB-level ) 权限,那么您将无法使用DBCC CHECKIDENT
,即使您 可以 创建 table、DROP TABLE
原始 table 并用 as newIDENTITY
从文字重新创建它——这很愚蠢。- 在这种情况下,请联系您的系统管理员寻求帮助,然后 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;