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*」を次のように定義しています。

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)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;

しかし、私はREADTEXTこの文脈で有効な実行ステートメントである100%ではありません。


実際にやろうとしていることを更新した後、分割関数はどうですか?

まず、数値テーブルを作成します。

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);

私のSQLServer2000システムでは、これにより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などの最新のメソッドと比較して並外れて高速ではありませんが、2000年に行き詰まっていると思われるREADTEXTやその他の難解なメソッドを処理するよりもはるかに面倒ではないはずです。

于 2012-08-24T15:06:34.160 に答える