1

dbo.GetNextNumber()呼び出しごとに連番を生成するSQLServer関数が欲しいのですが。私が理解している限り、SQL Serverは関数が決定論的でなければならないと主張しているため、ネイティブT-SQL関数ではこれは不可能です。しかし、これを実行するネイティブT-SQL関数を見せていただければ、本当に私の一日になります。

おそらくこれはCLR関数を使用して記述できるのではないかと思いました。CLR関数は静的であるため、シーケンス番号はset操作の呼び出しコンテキストに格納する必要があります。静的変数として格納すると、同じシーケンスを使用する複数の接続が発生し、それほど連続していない番号になります。組み込みCLRについて、設定操作(選択、更新、削除、挿入)の呼び出しコンテキストがCLR側から到達可能かどうかを確認するのに十分な知識がありません。

一日の終わりに、次のクエリ

select dbo.GetNextNumber() from sysobjects

結果を返す必要があります

1
2
3
4
5

コンテキストをリセットするための別の関数呼び出しが必要な場合は、次のように問題ありません。

exec dbo.ResetSequenceNumbers()

誤解を防ぎ、間違った質問に答える時間を無駄にする可能性を減らすために、私はテーブルのID生成関数を探していません。また、いくつかのハッキング(関数ではなくprocを使用していますが)を認識しています。 ID列を持つ一時テーブル。機能は近いですが、ROW_NUMBER()カットもしません。

ご回答ありがとうございます

ケマル

PSSQLServerにそのための組み込み関数があるのは驚くべきことです。関数(結合やwhere句で使用できない場合)は非常に簡単で非常に便利ですが、何らかの理由で含まれていません。

4

4 に答える 4

5

ランニングトータルの計算に関する私の記事に基づいてCLRシーケンスを実装したので、ROW_NUBER()関数を使用して同じことを実現できます。

このROW_NUMBER()関数にはORDER BYinOVER句が必要ですが、。による並べ替えを回避するための優れた回避策がありORDER BYます。による順序で式を配置することはできませんが、SELECT aConstantそこに配置することはできます。したがって、以下のステートメントを使用して、簡単に数値生成を実現できます。

SELECT
    ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RowNumber,
    *
FROM aTable
于 2011-08-18T09:39:20.977 に答える
2

SQL Serverの次のバージョンでは、SEQUENCEを使用してこれを行うことができます。以前のバージョンでは、別の「シーケンステーブル」(IDENTITY列のみを持つテーブル)に挿入し、SCOPE_IDENTITY()関数を使用して値を取得することで簡単に実行できます。関数でそれを行うことはできませんが、ストアドプロシージャを使用することはできます。

于 2011-08-17T15:02:10.873 に答える
2

なぜROW_NUMBER()それをカットしないのかについてもっと情報を与えることができますか?あなたが与える特定の例では、ROW_NUMBER()(適切な説明とともにOVER(ORDER BY))確かにあなたの基準に一致しているようです。

しかし、確かROW_NUMBER()に役に立たない場合もあり、その場合、通常は他の手法があります。

おそらく、この一般的な関数を使用することはあなたにとって有用に思えますが、ほとんどの場合、手元の問題に合わせた解決策が、より多くの困難を引き起こす汎用関数よりも優れたアイデアであることがわかります-あなたが常に取り組んでいる漏れのある抽象化のようにその周り。具体的には、リセット機能が必要だとおっしゃっています。グループ化を指定できるがあればROW_NUMBER()、そのようなことは必要ありません。OVER(PARTITION BY ORDER BY)

于 2011-08-17T15:08:52.747 に答える
0

SQL Server Denaliには、開発者向けの新しいシーケンス構造があります。Denali後のSQLServerでのシーケンス番号の管理と保守が簡単です。詳細については、 SQLServerのシーケンス番号を参照してください。

Denali以外のバージョンでは、シーケンステーブルを使用できます。SQL Serverのシーケンステーブルのサンプルを次に 示します。シーケンステーブルからシーケンス番号を読み取るには、この自動ID対応のSQLテーブルからダミーレコードを挿入する必要があります。

于 2011-08-18T05:10:20.693 に答える