0

私は顧客テーブルを持っており、私の要件は、新しい顧客が作成されるたびにランダムな一意の値を自動的に取得する新しい varchar 列を追加することです。

文字列をランダム化し、文字列が既に存在するかどうかを確認して再生成する SP を作成することを考えました。しかし、SP を顧客レコード作成プロセスに統合するには、コード レベルでトランザクション SQL が必要になるため、これは避けたいと思います。

助けてください?

編集: varchar は 1000 から 99999 までの数値を持つ 5 文字の長さである必要があり、数値が 10000 未満の場合は左側に 0 を埋め込むことを強調しておく必要があります。

4

6 に答える 6

3

varchar でなければならない場合は、uniqueidentifier を varchar にキャストできます。

ランダムな一意の識別子を取得するにはNewId()を実行します

キャストする方法は次のとおりです。

CAST(NewId() as varchar(36))

編集

@Brannon へのコメントによると:

テーブルに 99,000 レコードを超えることは決してないと言っているのですか? その場合は、PK を ID 列にし、1000 をシードして、ビジネス ロジックの左パディング「0」に注意してください。

于 2009-04-10T21:33:37.137 に答える
1

自動インクリメントに関するMichaelの回答はうまくいくはずです。顧客は「01000」、「01001」、「01002」のようになります。

よりランダムにしたい、またはしなければならない場合は、この場合、「01000」から「99999」までのすべての可能な値を含むテーブルを作成することをお勧めします。新しい顧客を挿入するときは、手法(ランダム化など)を使用して、そのテーブル(まだ利用可能な顧客IDのプール)から既存の行の1つを選択し、それを使用してテーブルから削除します。

それ以外のものは、時間の経過とともに本当に悪くなります。利用可能な顧客IDの90%または95%を使い果たしたと想像してください。残りの数少ない可能性のいずれかをランダムに見つけようとすると、「これは使用されますか?はい->次のIDを試してください」というほぼ無限の再試行につながる可能性があります。

マーク

于 2009-04-11T07:19:45.013 に答える
1

With your edit/update, sounds like what you need is an auto-increment and some padding.

Below is an approach that uses a bogus table, then adds an IDENTITY column (assuming that you don't have one) which starts at 1000, and then which uses a Computed Column to give you some padding to make everything work out as you requested.

CREATE TABLE Customers (
    CustomerName varchar(20) NOT NULL
)
GO

INSERT INTO Customers 
SELECT 'Bob Thomas' UNION
SELECT 'Dave Winchel' UNION
SELECT 'Nancy Davolio' UNION
SELECT 'Saded Khan'
GO

ALTER TABLE Customers
    ADD CustomerId int IDENTITY(1000,1) NOT NULL
GO 

ALTER TABLE Customers
    ADD SuperId AS right(replicate('0',5)+ CAST(CustomerId as varchar(5)),5) 
GO

SELECT * FROM Customers
GO

DROP TABLE Customers
GO
于 2009-04-10T22:19:18.820 に答える
1

この質問は、ユーザーが何をしたいのか、なぜそれをしたいのかを教えてくれないときと同じ気持ちを私に与えます。

「ランダム」と「ユニーク」は、シリアル リストを作成してからランダムに選択し、選択した値を削除しない限り、競合する要件です。

しかし、これが解決しようとしている問題は何ですか?

于 2009-04-10T22:06:20.583 に答える
1

ランダムな文字列データは特定の形式である必要がありますか? そうでない場合は、uniqueidentifier を使用してみませんか?

insert into Customer ([Name], [UniqueValue]) values (@Name, NEWID())

またはNEWID()、列のデフォルト値として使用します。

編集: @rmに同意し、データベースで数値を使用し、コードで文字列への変換(パディングなど)を処理します。

于 2009-04-10T21:34:19.287 に答える
0

これを試して:

ALTER TABLE Customer ADD AVarcharColumn varchar(50) 
CONSTRAINT DF_Customer_AVarcharColumn DEFAULT CONVERT(varchar(50), GETDATE(), 109)

ほとんどの場合、ミリ秒単位で日付と時刻を返します。

一意の値が本当に必要ですか?

于 2009-04-10T21:41:00.037 に答える