38

私はSQL Server 2005を使用しています。ストアド プロシージャに 2 つの WITH 句があります

WITH SomeClause1 AS
(
  SELECT ....
)
WITH SomeClause2 AS
(
  SELECT ....
)

しかし、エラーが発生します

キーワード「with」付近の構文が正しくありません。このステートメントが共通テーブル式または xmlnamespaces 節である場合、前のステートメントはセミコロンで終了する必要があります。

私のオプションは何ですか?私が知らないスプリッターはありますか?

4

4 に答える 4

70

コンマを使用して CTE を区切ります

;WITH SomeClause1 AS
(
  SELECT ....
)
, SomeClause2 AS
(
  SELECT ....
)
于 2009-09-17T14:10:36.967 に答える
17

「;」の追加を忘れてください エラーメッセージが言うように、前のステートメントに。常に「;WITH」のようにコーディングする習慣を身に付ければ、大丈夫です...

;WITH SomeClause1 AS
(
  SELECT ....
)

ただし、複数のCTEをコンマで接続する必要がありますが、「;WITH」の前には常にセミコロンがあります。

;WITH SomeClause1 AS
(
  SELECT ....
)
,SomeClause2 AS
(
  SELECT ....
)
于 2009-09-17T18:51:18.120 に答える
1

私にはうまくいきません。

私の場合、テーブル値のユーザー定義関数の RETURN 句内で CTE 値を使用しています。BEGIN-END で RETURN 句をラップすると、同じエラー メッセージが表示されますが、そのままの RETURN() 句は正常に機能します。この場合、エラー メッセージは正しくないと思います。

これは機能します:

CREATE FUNCTION [dbo].[ft_SplitStringOnChar]
      (
      @s varchar(8000),
      @sep char(1)
      )

RETURNS TABLE
AS

RETURN (
    WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s)
      UNION ALL
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
      WHERE stop > 0
    )
    SELECT pn AS TokenNumber,
      SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS TokenString
    FROM Pieces
  )

GO  

This does not:

CREATE FUNCTION [dbo].[ft_SplitStringOnChar]
      (
      @s varchar(8000),
      @sep char(1)
      )

RETURNS TABLE
AS
BEGIN
;
RETURN (
    WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s)
      UNION ALL
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
      WHERE stop > 0
    )
    SELECT pn AS TokenNumber,
      SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS TokenString
    FROM Pieces
  )
END
GO  
于 2010-06-15T16:41:14.513 に答える