web-dev-qa-db-ja.com

SQL Server2008でシーケンスを作成する方法

次のコードを使用してSQLServerでシーケンスを作成しています。ただし、不明なオブジェクトタイプとしてエラーが表示されます。解決策を教えてください

これが私のコードです:

create sequence seqval start with 100 increment by 1 minvalue 0 maxvalue 0 no cycle  
 no cache;

前もって感謝します

6
punitha

あなたはこれを行うことができます。

--Create a dummy TABLE to generate a SEQUENCE. No actual records will be stored.
CREATE TABLE SequenceTABLE
(
    ID BIGINT IDENTITY  
);
GO

--This procedure is for convenience in retrieving a sequence.
CREATE PROCEDURE dbo.GetSEQUENCE ( @value BIGINT OUTPUT)
AS
    --Act like we are INSERTing a row to increment the IDENTITY
    BEGIN TRANSACTION;
    INSERT SequenceTABLE WITH (TABLOCKX) DEFAULT VALUES;
    ROLLBACK TRANSACTION;
    --Return the latest IDENTITY value.
    SELECT @value = SCOPE_IDENTITY();
GO

--Example execution
DECLARE @value BIGINT;
EXECUTE dbo.GetSEQUENCE @value OUTPUT;
SELECT @value AS [@value];
GO
9
Graeme

Numbersテーブルを作成します。これが [〜#〜] so [〜#〜] この件に関する質問です。それをdbo.Numberと呼びましょう。

ID列のあるテーブルを用意します。シードとステップを適切なものに設定します。

create table dbo.SequenceGenerator(ID int identity(1, 1), dummy int);

次に、数値テーブルから値を挿入し、新しく生成されたID値をキャプチャします。

declare @HowMany int = 3;  -- This determines how large a sequence you receive
                           -- at each itteration
declare @NewSequenceValue table (ID int);

insert dbo.SequenceGenerator(dummy)
output INSERTED.ID 
    into @NewSequenceValue
select Number from dbo.Numbers
where Number <= @HowMany;

select * from @NewSequenceValue;

時々DELETE .. dbo.SequenceGeneratorするようにしてください。そうしないと、追加の価値がないために大きくなります。 TRUNCATEしないでください-IDENTITY列を最初に宣言されたシード値にリセットします。

2
Michael Green

SQL Server 2008はシーケンスを作成できません。シーケンスオブジェクトは、現在のバージョンを通じてSQL Server2012に適用されます。

https://msdn.Microsoft.com/es-es/library/ff878091(v = sql.120).aspx

代わりに、テーブルでIDENTITYを使用できます。次に例を示します。

CREATE TABLE Person(
    Id int IDENTITY(1,1) NOT NULL PRIMARY KEY,
    Name varchar(255) NOT NULL
);

IDENTITYの開始値は1で、新しいレコードごとに1ずつ増加します。

http://www.w3schools.com/sql/sql_autoincrement.asp

2
ernesto petit
WITH N0 as (SELECT 1 as n UNION ALL SELECT 1)
,N1 as (SELECT 1 as n FROM N0 t1, N0 t2)
,N2 as (SELECT 1 as n FROM N1 t1, N1 t2)
,N3 as (SELECT 1 as n FROM N2 t1, N2 t2)
,nums as (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) as num FROM N3)
SELECT * FROM nums
1
ban

SQL Server2008ではSequenceを簡単に使用することはできません。

SQL Server 2008でのシーケンス生成にCTE(共通テーブル式)を使用できます

WITH NUM_GEN (n) AS
     ( 
            SELECT 1 
            UNION 
                  ALLSELECT n+1 
            FROM  NUM_GEN 
            WHERE n+1< MAX_VALUE 
     ) 
SELECT n 
FROM   NUM_GEN
0
Lankesh Meshram