2016-05-02 5 views
0

をインクリメントしません。 NVARCHAR自動で新しいレコードのテストの挿入のための手順を作成Idを自動インクリメントvarchar型は、私は私の主キーとして<code>VARCHAR</code>列を使用しています

CREATE TABLE TESTING 
(
    ID VARCHAR(10), 
    NAME VARCHAR(15), 
    DESCP VARCHAR(50) 
); 

:私は自動インクリメントそれ(ベース62、大文字/小文字、数字)、ただし、以下のコードは、(明白な理由のために)失敗したいです-incremented ID:

CREATE PROCEDURE SP_INSERT 
    @NAME VARCHAR(MAX), @DESCP VARCHAR(MAX) 
AS 
BEGIN 
    /* Logic for getting new ID as per the NAME with PRE FIX */ 
    DECLARE @NEWID VARCHAR(5); 
    DECLARE @PREFIX VARCHAR(10); 

    SET @PREFIX = UPPER(SUBSTRING('STR', 1, 3)) 

    SELECT @NEWID = (@PREFIX + replicate('0', 3 - len(CONVERT(VARCHAR, N.OID 1))) + CONVERT(VARCHAR, N.OID + 1)) 
    FROM 
     (SELECT 
      CASE 
       WHEN MAX(T.TID) IS NULL 
       THEN 0 ELSE MAX(T.TID) 
      END AS OID 
     FROM 
      (SELECT SUBSTRING(ID, 1, 1) AS PRE_FIX, 
        SUBSTRING(ID, 2, LEN(ID)) AS TID 
       FROM Testing) AS T 
     WHERE 
      T.PRE_FIX = @PREFIX) AS N 
    /* INSERT QUERY FOR NEW RECORD */ 
    INSERT INTO Testing VALUES (@NEWID, @NAME, @DESCP) 

END

私は値を挿入しよう:

SP_INSERT 'svce','YOUR MANAGEMENT DESCRIPTION'; 

今回初めて、再度同じIDを取得するためにインセットを試みますが、インクリメントされません。

同様:

ID  Name 
------------ 
SVC001 SVCE 
SVC001 Svce 
+4

です。ホイールを再発明するときは、常に問題が発生します。単純なint ID列を主キーとして使用するか、行ごとに一意の列の組み合わせを使用します。選択または計算列としてvarchar値を作成します。 –

+0

ほとんどの場合、プライマリキーにはテーブルのクラスタ化インデックスがあることに注意してください。パフォーマンスのためには、クラスタ化インデックスをできるだけ小さく保つことがベストプラクティスです。 – shadow

答えて

-2

DECLARE @table TABLE(ID VARCHAR(10), 
NAME VARCHAR(15), 
DESCP VARCHAR(50)) 

DECLARE @NEWID VARCHAR(5); 
    DECLARE @PREFIX VARCHAR(10); 

SET @PREFIX = UPPER(SUBSTRING('STR', 1, 3)) 

SELECT @NEWID=CAST(ISNULL(MAX(CAST(SUBSTRING(ID,4,LEN(ID)) AS INT)),0)+1 AS varchar) FROM @table 
INSERT INTO @table(DESCP,ID,NAME) 
SELECT 'zzzz',(@PREFIX + replicate('0', 3 - len(CONVERT(VARCHAR,@NEWID))))[email protected],'fsf' 

SELECT @NEWID=CAST(ISNULL(MAX(CAST(SUBSTRING(ID,4,LEN(ID)) AS INT)),0)+1 AS varchar) FROM @table 
INSERT INTO @table(DESCP,ID,NAME) 
SELECT 'zzzz',(@PREFIX + replicate('0', 3 - len(CONVERT(VARCHAR,@NEWID))))[email protected],'fsf' 

SELECT * FROM @table 
+0

「これを試してください」は答えではありません。 OPのコードでどのような問題が認識されたか、どのような変更が提案されたのか、それが問題を解決する理由を説明します。 – CodeCaster

+0

ok @Doneyしかし、私はプロジェクトで使用したいので選択をリピートする必要はありませんので、ID増分値を選択する方法を教えてください –

+0

@Doneyこのコードは値が格納されていません –

1

は、あなたはそのようなCOMPUTED COLUMNなものを使用しようとすることができ、これを試してみてください:私はONE SMALL SCRIPTをMADE

create table t 
(
    Id int auto_increment, 
    ComputedId as 'SVC' + convert(nvarchar(60), lpad(Id,3,'0')), 
    Data nvarchar(60) 
) 
+0

私は既にこれを試しましたが、私はプライマリを設定することができませんので、他の提案があれば私はそのコードを移動してください –

0

を、

declare @t table (id varchar(10)) 
insert into @t values ('SVC001'),('SVC20902') 
Declare @NEWID int 
select @NEWID=isnull(max(replace(id,'SVC',''))+1,1) from @t 

select 'SVC'+ replicate('0',CASE WHEN 3-len(@NEWID)<=0 
THEN 0 ELSE 3-len(@NEWID) END)+cast(@NEWID as varchar(10)) 
+0

これは実際に働いていますが、ID値を自動的にインクリメントしたい –

+0

ロジックをUDFに入れ、計算列にUDFを呼び出します。 – KumarHarsh

+0

ok @ KumarHarsh私は試してみる –

0

最後に、私はAuto_Increment IDの解決策を得ました。私は解決のために次のコードを行った。コードは

alter PROCEDURE SP2_INSERT 
     @NAME VARCHAR(MAX), 
     @DESCP VARCHAR(MAX) 
AS 
BEGIN 
     DECLARE @NEWID VARCHAR(10); 
     DECLARE @PREFIX VARCHAR(MAX); 
    SET @PREFIX = UPPER(SUBSTRING(@NAME,1, 3)) 

    SELECT @NEWID = (@PREFIX + replicate('0', 3 - len(CONVERT(VARCHAR,N.OID + 1))) + CONVERT(VARCHAR,N.OID + 1)) FROM (
    SELECT CASE WHEN MAX(T.TID) IS null then 0 else MAX(T.TID) end as OID FROM (
    SELECT SUBSTRING(EmployeeID, 1, 1) as PRE_FIX,SUBSTRING(EmployeeID, 2, LEN(EmployeeID)) as TID FROM EmployeeMasters 
) AS T WHERE T.PRE_FIX = @PREFIX 
) AS N 
INSERT INTO Testing VALUES (@NEWID,@NAME,@DESCP) 
end 
関連する問題