2009-09-17 21 views
30

Im SQL Server 2005を使用しています。私は、ストアドプロシージャキーワード 'with' ... ...の前にある誤った構文は、セミコロンで終了する必要があります。

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

に句を持つ2を持っている。しかし、エラーが「は」キーワードの近くに

不適切な構文を発生します。このステートメントが共通テーブル式またはxmlnamespaces句である場合、前のステートメントはセミコロンで終了する必要があります。

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

答えて

53

;WITH SomeClause1 AS 
(
    SELECT .... 
) 
, SomeClause2 AS 
(
    SELECT .... 
) 
+0

同じすぎて、SQL Server 2008のMERGE文のために行く - それは** **セミコロンで終了する必要があります! –

+0

gbn、あなたは私の隠れ家を救った。 Delphiのクエリコンポーネントでこのエラーが発生しました。再度、感謝します。そしてあなたはダンカン。 –

13

加えることを忘れるCTEを区切るために、カンマを使用して ";"エラーメッセージのように、前のステートメントに戻ります。ただ、いつものようにそれをコーディングするのが習慣に取得する:「; WITH」を、あなたは大丈夫です...

;WITH SomeClause1 AS 
(
    SELECT .... 
) 

をただし、コンマで複数のCTEを接続する必要がありますが、「; WITH」は常に持っていますそれ以前のセミコロン:

;WITH SomeClause1 AS 
(
    SELECT .... 
) 
,SomeClause2 AS 
(
    SELECT .... 
) 
0

私のためには機能しません。

私の場合は、テーブル値のユーザー定義関数の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