在SQL Server中使用READTEXT方法

时间:2012-08-24 15:02:37

标签: sql-server-2000

根据微软MSDN上的这个链接:
http://msdn.microsoft.com/en-us/library/aa933206(v=sql.80

这是insert语句的语法。

Syntax

INSERT [ INTO] 
    { table_name WITH ( < table_hint_limited > [ ...n ] ) 
        | view_name 
        | rowset_function_limited 
    } 

    {    [ ( column_list ) ] 
        { VALUES 
            ( { DEFAULT | NULL | expression } [ ,...n] ) 
            | derived_table 
            | execute_statement 
        } 
    } 
    | DEFAULT VALUES

< table_hint_limited > ::= 
    { FASTFIRSTROW 
        | HOLDLOCK 
        | PAGLOCK 
        | READCOMMITTED 
        | REPEATABLEREAD 
        | ROWLOCK 
        | SERIALIZABLE 
        | TABLOCK 
        | TABLOCKX 
        | UPDLOCK 
    }

此外,在文档中,它定义了&#34; * execute_statement *&#34;在VALUES子句中如下:

  

execute_statement

     

是否有任何有效的EXECUTE语句返回带有SELECT或的数据    READTEXT 语句。

我在存储过程中尝试了以下格式:

  INSERT INTO #MANAGERS (MANAGERCHARS) 
      READTEXT #MANAGERS.MANAGERIDS @ptrval @CharIndex 1 

并收到以下错误:

Msg 156, Level 15, State 1, Procedure usp_TestQualityMonitor, Line 117
Incorrect syntax near the keyword 'READTEXT'.

根据我在这个问题中提到的文档,READTEXT应该是一个有效的方法作为execute_statement,所以我做错了什么?为什么我收到此消息?以及如何在没有错误的情况下正确格式化此语句?

注意:通过删除&#34; VALUES&#34;修复SQL。仍然得到同样的错误。

1 个答案:

答案 0 :(得分:1)

如果仔细阅读语法图,可以使用

(a)价值观(等)

OR

(b)派生表

OR

(c)execute_statement

你不能说:

INSERT dbo.table VALUES(EXEC dbo.procedure);

但是可以说:

INSERT dbo.table EXEC dbo.procedure;

(当然取决于dbo.procedure的作用。)

所以也许你可以试试:

INSERT INTO #MANAGERS (MANAGERCHARS) --VALUES 
  READTEXT #MANAGERS.MANAGERIDS @ptrval @CharIndex 1;

但是,我不是100%READTEXT在此上下文中是有效的执行语句。


在更新你真正要做的事情之后,分割功能怎么样?

首先,创建一个数字表:

SELECT n = IDENTITY(INT, 1, 1) INTO dbo.Numbers
FROM syscolumns CROSS JOIN syscolumns AS c2;

CREATE UNIQUE CLUSTERED INDEX n ON dbo.Numbers(n);

在我的SQL Server 2000系统上,这会创建66,000多行,因此它将支持超过64K的字符串。如果您的字符串长于此值,则可能需要添加额外的交叉连接。

现在,创建一个将处理NTEXT的拆分函数(大多数你会发现这些天不会打扰,因为NTEXT已被弃用,并且大多数人已经能够完全丢弃SQL Server 2000)。我不记得我最初在哪里采购这个,但我已经使用它好几年了:

ALTER FUNCTION dbo.Split_NTEXT
(
  @list      NTEXT,
  @delimiter CHAR(1)
)
RETURNS @table TABLE
(
  string NVARCHAR(4000)
)
AS
BEGIN
  DECLARE @chunks TABLE (chunk NVARCHAR(4000) NOT NULL);

  DECLARE @chunk NVARCHAR(4000), @p INT, @ml INT, @e INT;

  SELECT @p = 1, @ml = 3998;

  WHILE (DATALENGTH(@list)/2) - (@p-1) >= @ml
  BEGIN
   SET @chunk = SUBSTRING(@list, @p, @ml);
   SET @e = @ml - CHARINDEX(@delimiter, REVERSE(@chunk));
   INSERT @chunks(chunk) SELECT @delimiter + SUBSTRING(@chunk, 1, @e) + @delimiter;
   SET @p = @p - 1 + @e + 2;
  END
  INSERT @chunks(chunk) SELECT @delimiter + SUBSTRING(@list, @p, @ml) + @delimiter;

  INSERT @table(string) SELECT s = LTRIM(RTRIM(SUBSTRING(s.chunk, n.n + 1,
        CHARINDEX(@delimiter, s.chunk, n.n + 1) - n.n - 1)))
      FROM dbo.Numbers AS n INNER JOIN @chunks AS s 
        ON n.n <= LEN(s.chunk) - 1
        AND SUBSTRING(s.chunk, n.n, 1) = @delimiter;
  RETURN;
END
GO

用法:

SELECT string
  FROM dbo.Split_NTEXT(N'foo,bar,blat,mort,splunge', ',');

结果:

string
--------
foo
bar
blat
mort
splunge

CLRTVP等更现代的方法相比,这不会特别快,但与处理READTEXT或其他神秘方法相比,你可能认为自己陷入困境的麻烦相对较少在2000年。