求教这样的自定义函数怎么写?SQL SERVER2000表里有这样一个字段:
统计局*0001*A*张一
统计局*0002*B*张二
建设局*0001*A*李一
建设局*0002*B*李二写一个函数,提取出第一个*之前的数据,以及第一个*与第二个*之间的数据,即生成下面这样的数据:
统计局  0001
统计局  0002
建设局  0001
建设局  0002

解决方案 »

  1.   

    补充说明,第一个*之前的文字个数不一定相等,第一个*与第二个*之间的文字也不一定相等,即表里的数据可能是下面的格式:
    统计局1111*000551*A*张一
    统计局22*00052*B*张二
    建设局333333333333*00055555551*A*李一
    建设局2*005502*B*李二
      

  2.   

    如果不超过4个*,可使用PARSENAME函数
      

  3.   

    --> 生成测试数据表: [tb]
    IF OBJECT_ID('[tb]') IS NOT NULL
    DROP TABLE [tb]
    GO
    CREATE TABLE [tb] ([col] [nvarchar](20))
    INSERT INTO [tb]
    SELECT '统计局*0001*A*张一' UNION ALL
    SELECT '统计局*0002*B*张二' UNION ALL
    SELECT '建设局*0001*A*李一' UNION ALL
    SELECT '建设局*0002*B*李二'--SELECT * FROM [tb]-->SQL查询如下:
    IF OBJECT_ID('dbo.f_getstr')>0
    DROP FUNCTION dbo.f_getstr
    GO
    --分段截取函数(邹建)
    CREATE FUNCTION dbo.f_GetStr(
    @s varchar(8000),      --包含多个数据项的字符串
    @pos int,             --要获取的数据项的位置
    @split varchar(10)     --数据分隔符
    )RETURNS varchar(100)
    AS
    BEGIN
    IF @s IS NULL RETURN(NULL)
    DECLARE @splitlen int
    SELECT @splitlen=LEN(@split+'a')-2
    WHILE @pos>1 AND CHARINDEX(@split,@s+@split)>0
    SELECT @pos=@pos-1,
    @s=STUFF(@s,1,CHARINDEX(@split,@s+@split)+@splitlen,'')
    RETURN(ISNULL(LEFT(@s,CHARINDEX(@split,@s+@split)-1),''))
    END
    GOSELECT  dbo.f_GetStr(col,1,'*') col1,dbo.f_GetStr(col,2,'*') col2 FROM tb
    /*
    col1                                                                                                 col2
    ---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
    统计局                                                                                                  0001
    统计局                                                                                                  0002
    建设局                                                                                                  0001
    建设局                                                                                                  0002(4 行受影响)
    */
      

  4.   

    htl258,谢谢你!
    dbo.f_GetStr(col,1,'*')----
    col里可能同时有*和*,如果这两种星号都同时存在,f_GetStr函数无法得到正确的结果