2009-09-17 13 views
30

Im ile sonlandırılması gerekir. Benim saklı yordam'with' anahtar sözcüğünün yanında yanlış sözdizimi ... Önceki ifadenin, SQL Server 2005 kullanarak bir noktalı virgülle

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

yılında Cümleleri İLE 2 tane var Ama hatası 'ile' anahtar sözcüğü yakınında

Yanlış sözdizimi oluşur. Bu ifade, bir ortak tablo ifadesi veya bir xmlnamespaces deyimiyse, önceki ifadenin noktalı virgülle sonlandırılması gerekir.

Seçeneklerim nelerdir? Bilmediğim bir splitter var mı?

cevap

53

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

aynı çok SQL Server 2008 birleştirme deyimini için de geçerli - bu ** zorunluluk ** noktalı virgül ile sona erdirilebilir! –

+0

gbn, gizemi kurtardın. Delphi'de bir sorgu bileşeni üzerinde bu hatayı alıyorum, güdük! Tekrar teşekkürler. Ve sen Duncan. –

13

ekleyerek unutun CTEs ayırmak için virgül kullanın ";" Önceki ifadeye, hata mesajında ​​olduğu gibi. Sadece her zamanki gibi onu kodlama alışkanlığı elde: "; WITH" ve iyi olacak ...

;WITH SomeClause1 AS 
(
    SELECT .... 
) 

ancak, virgül ile birden CTEs bağlamak gerekir, ancak "; İLE" her zaman olan bir Bundan önce noktalı virgül:

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

Benim için çalışmıyor.

Benim durumumda, tablo değerli kullanıcı tanımlı bir işlevin RETURN deyiminde CTE değeri kullanıyorum. RETURN yan tümcesini BEGIN-END'te kopyalarsam, aynı hata iletisini alıyorum, ancak çıplak bir RETURN() deyimi tamam çalışıyor. Bu durumda hata mesajının yanlış olduğuna inanıyorum. ,

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