我想用 newid() 的 newsequentialid() 函式生成一些 GUID
CREATE TABLE AssetPoints
(
Id int IDENTITY(1,1) PRIMARY KEY,
AssetOwner uniqueidentifier,
assetValue int,
RV rowversion
);
GO
declare @i int = 0
while (@i < 10)
begin
INSERT INTO AssetPoints (AssetOwner, assetValue) VALUES (newsequentialid(), 1000 @i);
set @i = @i 1
end
GO
但出現以下錯誤:
newsequentialid() 內置函式只能用于 CREATE TABLE 或 ALTER TABLE 陳述句中型別為“uniqueidentifier”的列的 DEFAULT 運算式中。它不能與其他運算子組合形成復雜的標量運算式。
是否可以按順序使用創建一些 GUID newsequentialid()?或者newsequentialid()在表的默認子句中使用NOT ONLY?
uj5u.com熱心網友回復:
或使用 newsequentialid() NOT ONLY 在表的默認子句中?
如果你想要,比如說,1000 個連續的 guid,也許是出于臨時原因,或者在你沒有真正有一個永久表來放置它們的情況下,那么你仍然可以遵守 SQLServer 的“僅在列默認值中”的堅持一個具有該默認值的表變數,并插入它(省略 guid 列以生成默認值):
DECLARE @t TABLE(g UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID(), x CHAR(1));
INSERT INTO @t(x) SELECT TOP 1000 'x' FROM some_big_table
SELECT g FROM @t
然后,您可以將這 1000 個 guid 用于您需要的任何東西.. 也許您想將它們插入某個需要 guid 但不生成自己的(或生成隨機的)等的表中,所以您可以這樣做INSERT INTO PersonTest SELECT g, 'John', Smith' FROM @t......
還有其他方法可以生成任意 1000 行;我只是在這里選擇了一個簡單的方法,即從一些超過 1000 行的大表中選擇 1000 行。如果你沒有超過1000行的表,看看其他方式
uj5u.com熱心網友回復:
錯誤告訴你問題所在。您沒有在NEWSEQUENTIALID()中定義INSERT,而是使用默認值 來定義列NEWSEQUENTIALID()。
這也在檔案中注明:
NEWSEQUENTIALID() 只能與型別為 uniqueidentifier 的表列的 DEFAULT 約束一起使用。
...
NEWSEQUENTIALID 不能在查詢中參考。
你應該做的是這樣的:
CREATE TABLE dbo.AssetPoints (Id int IDENTITY(1, 1)
CONSTRAINT PK_AssetPoints PRIMARY KEY, --Always name your constraints
AssetOwner uniqueidentifier
CONSTRAINT DF_AssetOwner --Always name your constraints
DEFAULT NEWSEQUENTIALID(),
assetValue int,
RV rowversion);
GO
INSERT INTO dbo.AssetPoints (assetValue)
VALUES (1000),
(1001),
(1002);
GO
SELECT *
FROM dbo.AssetPoints;
GO
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/347370.html
標籤:sql-server
