SQL Server 2005を使用しています。ストアドプロシージャに2つのWITH句があります
WITH SomeClause1 AS
(
SELECT ....
)
WITH SomeClause2 AS
(
SELECT ....
)
しかし、エラーが発生します
キーワード「with」の近くの構文が正しくありません。このステートメントが共通テーブル式またはxmlnamespaces句の場合、前のステートメントはセミコロンで終了する必要があります。
私のオプションは何ですか?知らないスプリッターはありますか?
CTEを区切るにはコンマを使用します
;WITH SomeClause1 AS
(
SELECT ....
)
, SomeClause2 AS
(
SELECT ....
)
「;」の追加は忘れてくださいエラーメッセージが言うように、前のステートメントに。 「; WITH」のように常にコーディングする習慣を身に付ければ、大丈夫です...
;WITH SomeClause1 AS
(
SELECT ....
)
ただし、複数のCTEをコンマで接続する必要がありますが、「; WITH」の前には常にセミコロンがあります。
;WITH SomeClause1 AS
(
SELECT ....
)
,SomeClause2 AS
(
SELECT ....
)
Mladen Prajdicは、これを "with xmlnamespaces"のソリューションとして提案し、うまく機能しています。
http://itknowledgeexchange.techtarget.com/sql-server/using-xmlnamespaces-within-a-function/
私にはうまくいきません。
私の場合、テーブル値のユーザー定義関数のRETURN句内でCTE値を使用しています。 RETURN句をBEGIN-ENDでラップすると、同じエラーメッセージが表示されますが、裸の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