在很多程序中,我们都要用到汉字的首拼音,如用他来方便查找数据等,在网上我们可以看到很多这样的算法。下面这段代码是SQLServer2000的存储过程,调用该存储过程,自动更新数据库中的拼音首字母列。用到了procedure,cursor技术。
  1USE Database Name
  2GO
  3
  4IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'sp_GetChineseSpell')
  5    BEGIN
  6        PRINT 'Dropping Procedure sp_GetChineseSpell'
  7        DROP  Procedure  sp_GetChineseSpell
  8    END
  9
 10GO
 11
 12PRINT 'Creating Procedure sp_GetChineseSpell'
 13GO
 14CREATE Procedure sp_GetChineseSpell
 15
 16AS
 17/******************************************************************************
 18**        File: sp_GetChineseSpell.sql
 19**        Name: sp_GetChineseSpell
 20**        Desc: 返回某列汉字的拼音码,在Sql server 2000安装为中文版时调试通过
 21**
 22**              
 23**        Return values: null
 24** 
 25**        Called by: 
 26**              
 27**        Parameters:
 28**        Input:    null                    Output:null
 29**                 ----------                    -----------
 30**
 31**        Auth:  Xinhua Yuan
 32**        Date:  
 33*******************************************************************************
 34**        Change History
 35*******************************************************************************
 36**        Date:        Author:                Description:
 37**        --------        --------                -------------------------------------------
 38**    
 39*******************************************************************************/

 40BEGIN
 41
 42--返回某列汉字的拼音码
 43
 44DECLARE @VChChinese VARCHAR(60)          --汉字列数据量
 45DECLARE @VChSp      VARCHAR(30)          --拼音码数据列
 46DECLARE @VChSpell   VARCHAR(30)         
 47DECLARE @VChControl CHAR(2)          --存储临时取出的单个汉字
 48DECLARE @IntLen     INT
 49DECLARE @IntControl INT
 50
 51SELECT  @VChSp=''
 52
 53DECLARE @IntCount INT
 54DECLARE @IntTotalCount INT
 55SELECT  @IntCount=0
 56SELECT  @IntTotalCount=(SELECT COUNT(*FROM table name)
 57
 58DECLARE CursorSpell CURSOR FOR                --Declare cursor
 59SELECT  Chinese field,Spell field
 60FROM table name
 61
 62OPEN CursorSpell                    --Open cursor
 63
 64BEGIN TRAN
 65  WHILE @@Fetch_Status=0
 66
 67  BEGIN
 68                                 --About operation
 69     SELECT @IntCount = @IntCount + 1
 70     SELECT @VChChinese=''
 71         SELECT @VChSpell=''
 72         SELECT @VCHSp=''
 73
 74         FETCH NEXT FROM CursorSpell INTO @VChChinese,@VChSpell
 75     SELECT  @IntControl=1
 76         
 77         PRINT @VChChinese + @VChSpell
 78         
 79         SELECT @IntLen=Len(@VChChinese)
 80         
 81         WHILE @IntControl<= @IntLen
 82         
 83       BEGIN
 84         SELECT @VChControl=SUBSTRING(@VCHCHinese,@IntControl,1)
 85
 86   
 87   IF @VChControl>'' AND @VChControl<'' 
 88     SELECT @VChSpell='A'
 89   ELSE IF @VChControl>='' AND @VChControl<'' 
 90     SELECT @VChSpell='B'
 91   ELSE IF @VChControl>='' AND @VChControl<'' 
 92     SELECT @VChSpell='C'
 93   ELSE IF @VChControl>='' AND @VChControl<'' 
 94     SELECT @VChSpell='D'
 95   ELSE IF @VChControl>='' AND @VChControl<'' 
 96     SELECT @VChSpell='E'
 97   ELSE IF @VChControl>='' AND @VChControl<=''
 98     SELECT @VChSpell='F'
 99   ELSE IF @VChControl>'' AND @VChControl<'' 
100     SELECT @VChSpell='G'
101   ELSE IF @VChControl>='' AND @VChControl<'' 
102     SELECT @VChSpell='H'
103   ELSE IF @VChControl>='' AND @VChControl<''
104     SELECT @VChSpell='J'
105   ELSE IF @VChControl>='' AND @VChControl<'' 
106     SELECT @VChSpell='K'
107   ELSE IF @VChControl>='' AND @VChControl<'' 
108     SELECT @VChSpell='L'
109   ELSE IF @VChControl>='' AND @VChControl<'' 
110     SELECT @VChSpell='M'
111   ELSE IF @VChControl>='' AND @VChControl<'' 
112     SELECT @VChSpell='N'
113   ELSE IF @VChControl>='' AND @VChControl<'' 
114     SELECT @VChSpell='O'
115   ELSE IF @VChControl>='' AND @VChControl<''
116     SELECT @VChSpell='P'
117   ELSE IF @VChControl>='' AND @VChControl<'' 
118     SELECT @VChSpell='Q'
119   ELSE IF @VChControl>='' AND @VChControl<'' 
120     SELECT @VChSpell='R'
121   ELSE IF @VChControl>='' AND @VChControl<'' 
122     SELECT @VChSpell='S'
123   ELSE IF @VChControl>='' AND @VChControl<''
124     SELECT @VChSpell='T'
125   ELSE IF @VChControl>='' AND @VChControl<'' 
126     SELECT @VChSpell='W'
127   ELSE IF @VChControl>='' AND @VChControl<''
128     SELECT @VChSpell='X'
129   ELSE IF @VChControl>='' AND @VChControl<'' 
130     SELECT @VChSpell='Y'
131   ELSE IF @VChControl>='' AND @VChControl<='' 
132     SELECT @VChSpell='Z'
133   ELSE
134     SELECT @VChSpell=@VChControl
135   
136   SELECT @VChSp=@VChSp + RTRIM(UPPER(@VChSpell))
137   SELECT @IntControl=@IntControl + 1
138
139  END
140        --PRINT @VChSp           
141          UPDATE table name SET  Spell field = @VChSp
142                 
143          WHERE CURRENT OF CursorSpell
144
145  END
146
147COMMIT TRAN        
148
149CLOSE CursorSpell                            --Close cursor            
150DEALLOCATE CursorSpell                        --Deallocate cursor
151
152END
153
154GO
155
156GRANT EXEC ON sp_GetChineseSpell TO PUBLIC
157
158GO
159
        本存储过程在SqlServer2000中测试通过.
posted on 2006-03-24 14:35  知其所以然  阅读(385)  评论(0)    收藏  举报