Ответ 1
Используйте запятую для разделения CTE
;WITH SomeClause1 AS
(
SELECT ....
)
, SomeClause2 AS
(
SELECT ....
)
Я использую SQL Server 2005. У меня есть 2 WITH Clauses в моей хранимой процедуре
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 ....
)
Младен Прадждич предложил это как решение для "с xmlnamespaces", отлично работает.
http://itknowledgeexchange.techtarget.com/sql-server/using-xmlnamespaces-within-a-function/
Не работает для меня.
В моем случае я использую значение CTE в предложении RETURN функции, определяемой таблицей. Если я завершаю предложение 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