私は親テーブルを持つcustomerテーブルを作成しています。 顧客表の既存のvarchar(4)列である会社IDの組み合わせであるcustomer表の主キーを作成することがあります(chagrin)。 customer.companySQL Server:カウンタと別の列の値に基づいてプライマリキーを生成
残りのvarchar(9)プライマリキーは、その会社内の顧客数を増やすゼロ埋め込みカウンタです。
など。 company = MSFTの場合、これはMSFTレコードの最初の挿入です。PKはMSFT00001、MSFT00002などの後続の挿入でMSFT00001 となります。 会社= INTLで最初のレコードが挿入されると、最初のレコードはbe INTL00001
私は他のstackoverflowレスポンスから作成したトリガーとudfの代わりに、まず始めました。
ALTER FUNCTION [dbo].[GetNextID]
(
@in varchar(9)
)
RETURNS varchar(9) AS
BEGIN
DECLARE @prefix varchar(9);
DECLARE @res varchar(9);
DECLARE @pad varchar(9);
DECLARE @num int;
DECLARE @start int;
if LEN(@in)<9
begin
set @in = Left(@in + replicate('0',9) , 9)
end
SET @start = PATINDEX('%[0-9]%',@in);
SET @prefix = LEFT(@in, @start - 1);
declare @tmp int;
set @tmp = len(@in)
declare @tmpvarchar varchar(9);
set @tmpvarchar = RIGHT(@in, LEN(@in) - @start + 1)
SET @num = CAST( RIGHT(@in, LEN(@in) - @start + 1) AS int ) + 1
SET @pad = REPLICATE('0', 9 - LEN(@prefix) - CEILING(LOG(@num)/LOG(10)));
SET @res = @prefix + @pad + CAST(@num AS varchar);
RETURN @res
END
は、どのように私は私の代わりに値を挿入し、この主キーをインクリメントするトリガを書くでしょう。または私はそれをあきらめて、芝生の経営を始めなければなりませんか?
申し訳ありませんが、そのtmpvarchar変数SQLサーバーは、私にそれなしで奇妙な結果を与えていました。
私はこれをしません。計算された列がサポートされている場合(2005+?)、IDENTITY値と接頭辞としての任意の任意の文字列を結合する計算列を追加します。 –
@OMG Ponies:それは私の最初の考えでもありましたが、各社の顧客が1で始まるビジネス要件を満たすものではありません。 –
@Joe:これまでに読んだことはありませんでした/だから、おそらくROW_NUMBERを使うだろうか? –