求一个函数,传入参数是ntext类型的逗号分隔的字符串,可能非常长,超过8K。
要求根据逗号分隔的结果返回一个表。表的行内容就是逗号分隔的内容。谢谢。

解决方案 »

  1.   

    CREATE TABLE A(id INT,country VARCHAR(100))
    INSERT A
    SELECT 1,'中国;日本;韩国' UNION ALL
    SELECT 2,'美国;意大利;法国' UNION ALL
    SELECT 3,'德国'
    SELECT * FROM A-- 建立一个辅助的临时表就可以了
    SELECT TOP 8000 id = identity(int,1,1) 
    INTO # FROM syscolumns a, syscolumns b    
    SELECT 
        A.ID, 
        COUNTRY = SUBSTRING(A.COUNTRY, B.ID, CHARINDEX(';', A.COUNTRY + ';', B.ID) - B.ID) 
    FROM A, # B
    WHERE SUBSTRING(';' + a.COUNTRY, B.id, 1) = ';'   
    ORDER BY 1,2
    GO
    DROP TABLE A,#
      

  2.   

    楼上的好像不太对。关键是我要从一个ntext的很长的字符串中生成表,而substring对于超出8k之外的范围的字符串,就无法得到了。
      

  3.   

    我是这样处理的,但是无论如何,就是不行:ALTER FUNCTION [dbo].[GetSplitStringEx] 
    (
    -- Add the parameters for the function here
    @str ntext, 
    @spli nvarchar(10)
    )
    RETURNS 
    @re TABLE 
    (
    -- Add the column definitions for the TABLE variable here
    SplitString ntext
    )
    AS
    BEGIN
    -- Fill the table variable with the rows for your result set DECLARE @splen int  --分隔字符串长度
    SELECT @splen = LEN(@spli)  --得到分隔字符串的长度 DECLARE @i int  --内部变量,用于记录分隔符在字符串中的位置
    DECLARE @lastpos int --内部变量,用于记录上一个分隔符号所在的位置

    SET @i = 1
    SET @lastpos = 0 WHILE (1=1)  --如果字符串中存在分隔符
    BEGIN
    SELECT @i = CHARINDEX(@spli, @str, @lastpos+@splen)  --得到下一个分隔符号所在的位置 IF(@i > 0)
    BEGIN
    INSERT INTO @re
    VALUES(SUBSTRING(@str, @lastpos+@splen, @i-@splen-@lastpos))  --将两个分隔符号之间的内容插入到表中
    END
    ELSE
    BEGIN
    BREAK;
    END SET @lastpos = @i
    END RETURN 
    END
      

  4.   

    这类似的问题,在我的blog里有类似的问题。可以给楼主启发。
      

  5.   

    算了,我还是换SQL 2005吧。