基本的に既存のテーブル (約 150,000 行) を ID で更新する SQL ストアド プロシージャを作成する必要があります。
このストアド プロシージャが実行するテーブルは、基本的に、人、名前、住所などのリストです。
個人の ID のアルゴリズムは次のとおりです。 - 個人の名の最初の 4 文字までを使用します。- 人の姓の最初の 2 文字までとります。- フィールドが 8 文字になるまで、残りを 0 で埋め、最後にカウント番号を付けます。
たとえば、JOHN SMITH という名前の ID は「JOHNSM00」になります。JOHN SMITH が 2 人いた場合、次の人物の ID は JOHNSM01 になります。たとえば、個人名が FI LYNN の場合、ID は FILY0000 になります。
私が書いた次のストアド プロシージャがありますが、実行に約 9 時間かかります。私が見逃しているこれを行うためのより良い方法はありますか?
ALTER PROCEDURE [dbo].[LM_SP_UPDATE_PERSON_CODES]
AS
DECLARE @NAMEKEY NVARCHAR(10)
DECLARE @NEWNAMEKEY NVARCHAR(10)
DECLARE @LENGTH INT
DECLARE @KEYCOUNT INT
DECLARE @I INT
DECLARE @PADDING NVARCHAR(8)
DECLARE @PERSONS CURSOR
DECLARE @FIRSTNAME NVARCHAR(30)
DECLARE @LASTNAME NVARCHAR(30)
SET @PADDING = '00000000'
--FIRST CLEAR OLD NEW NAMEKEYS IF ANY EXIST
UPDATE LM_T_PERSONS SET NEW_NAMEKEY = NULL
SET @PERSONS = CURSOR FOR
SELECT NAMEKEY, NAME_2, NAME_1 FROM LM_T_PERSONS
OPEN @PERSONS
FETCH NEXT FROM @PERSONS INTO @NAMEKEY, @FIRSTNAME, @LASTNAME
WHILE @@FETCH_STATUS = 0
BEGIN
--CHECK THE LENGTH OF FIRST NAME TO MAKE SURE NOTHING EXCEEDS 4
SET @LENGTH = LEN(@FIRSTNAME)
IF @LENGTH > 4
SET @LENGTH = 4
SET @NEWNAMEKEY = SUBSTRING(@FIRSTNAME,1,@LENGTH)
--CHECK THE LENGTH OF LAST NAME TO MAKE SURE NOTHING EXCEEDS 2
SET @LENGTH = LEN(@LASTNAME)
IF @LENGTH > 2
SET @LENGTH = 2
SET @NEWNAMEKEY = @NEWNAMEKEY + SUBSTRING(@LASTNAME,1,@LENGTH)
SET @LENGTH = LEN(@NEWNAMEKEY)
SET @I = 0
SET @PADDING = SUBSTRING('00000000',1,8 - LEN(@NEWNAMEKEY) - LEN(CONVERT(NVARCHAR(8),@I)))
--SEE IF THIS KEY ALREADY EXISTS
SET @KEYCOUNT = (SELECT COUNT(1) FROM LM_T_PERSONS WHERE NEW_NAMEKEY = @NEWNAMEKEY + @PADDING + CONVERT(NVARCHAR(8),@I) )
WHILE @KEYCOUNT > 0
BEGIN
SET @I = @I+1
SET @PADDING = SUBSTRING('00000000',1,8 - LEN(@NEWNAMEKEY) - LEN(CONVERT(NVARCHAR(8),@I)))
SET @KEYCOUNT = (SELECT COUNT(1) FROM LM_T_PERSONS WHERE NEW_NAMEKEY = @NEWNAMEKEY + @PADDING + CONVERT(NVARCHAR(8),@I) )
END
UPDATE LM_T_PERSONS SET NEW_NAMEKEY = @NEWNAMEKEY + @PADDING + CONVERT(NVARCHAR(8),@I) WHERE NAMEKEY = @NAMEKEY
FETCH NEXT FROM @PERSONS INTO @NAMEKEY, @FIRSTNAME, @LASTNAME
END
CLOSE @PERSONS
DEALLOCATE @PERSONS