0

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

这是插入语句的语法。

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 
    }

在文档中,它在 VALUES 子句中定义了“*execute_statement*”,如下所示:

执行语句

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

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

  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 的有效方法,那么我做错了什么?为什么我会收到此消息?以及如何正确格式化此语句而不会出错?

注意:通过删除“VALUES”来修复 SQL。仍然得到同样的错误。

4

1 回答 1

1

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

(a) 价值观(等)

或者

(b) 派生表

或者

(c) 执行语句

你不能说:

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 年被困住的神秘方法要少得多。

于 2012-08-24T15:06:34.160 回答