我想使用引數設定自定義身份,例如
CREATE TABLE Pets (
PetId int IDENTITY(@Parameter,1) PRIMARY KEY,
PetName varchar(255)
);
我的 SQL 決議器不接受這樣的語法。
uj5u.com熱心網友回復:
IDENTITY雖然您確實需要在in陳述句中使用文字整數(或根本不使用),但您可以在使用支持引數的表創建表后CREATE TABLE重置IDENTITY種子值:DBCC CHECKIDENT
還:
- 使用 SQL Server 時,您應該始終使用其父架構完全限定物件名稱(默認值為
dbo),否則可能會在不同的架構中創建物件,并且在從其他架構中的物件尋址時將無法決議名稱(這有助于提高性能也)。 - 此外,這里有一些未經請求的資料庫設計和資料建模指標:
- 一般來說,
NOT NULL除非您絕對確定否則所有列都應該是。- 特別是對于文本列:沒有什么比處理包含兩個值
NULL和空白''值的文本列更煩人的了,而且不知道兩者之間是否存在任何語意差異。- 額外的賓果游戲:如果該列還包含非空但空白字串。伙計們,這就是
CHECK約束的目的!
- 額外的賓果游戲:如果該列還包含非空但空白字串。伙計們,這就是
- 特別是對于文本列:沒有什么比處理包含兩個值
- 此外,令人討厭的是,如果您沒有在列規范中指定
NOT NULL或指定,則 SQL Server 默認為假設.NULLCREATE TABLENULL
- 一般來說,
- 名稱,或者實際上任何包含人類可讀文本的文本列通常應該是
nvarchar而不是varchar.- 這不適用于其
varchar型別本身支持 Unicode 的其他 RDBMS。 - 例外情況是使用 SQL Server 奇怪地實作的對 UTF-8 的支持,但這是另一個討論。
- 這不適用于其
無論如何,像這樣:
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命令移動到單獨的命令批處理中。
uj5u.com熱心網友回復:
您可以使用動態 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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/436626.html
