Не удается запросить несколько раз из нескольких общих табличных выражений (WITH)? - PullRequest
2 голосов
/ 16 марта 2012

Сегодня я делал запросы в T-SQL, SQL-Server-2008 и наткнулся на что-то странное, чего я не понимал.Используя окна запросов, я пытаюсь сделать запрос из двух распространенных табличных выражений, например так (я вычеркнул много кода, чтобы сделать его более понятным):

;WITH temp1 AS (SELECT * FROM dbo.Log)
, temp2 AS (SELECT  * FROM dbo.SignalCodeItems300_tbl)

SELECT * FROM temp1
SELECT * FROM temp2

Однако только одно изоператоры выбора будут выполняться, первый.Независимо от того, который есть какой, только первый пробег.Я предполагаю, что это какая-то синтаксическая вещь, которую мне не хватает, может быть?Я получаю сообщение об ошибке «Неверное имя объекта« temp2 »».

Может ли кто-нибудь пролить свет на эту проблему?Есть ли обходные пути для этого?

Ответы [ 3 ]

1 голос
/ 16 марта 2012

Возможно, вы захотите взглянуть на документацию MSDN .

Особенно:

Multiple CTE query definitions can be defined in a nonrecursive CTE. 
The definitions must be combined by one of these set operators:
UNION ALL, UNION, INTERSECT, or EXCEPT.

Вы не можете смешивать и сопоставлять две разные схемы, поскольку по сути это выполняется как один запрос.

1 голос
/ 16 марта 2012

Нет, все работает как надо. CTE (общее табличное выражение) доступно только для первого оператора после определения. Другими словами, после select * from temp1 они оба становятся недоступными.

Исправление будет следующим:

;WITH temp1 AS (SELECT * FROM dbo.Log)
SELECT * FROM temp1

;WITH temp2 AS (SELECT  * FROM dbo.SignalCodeItems300_tbl)
SELECT * FROM temp2
0 голосов
/ 12 апреля 2014

Используйте представление или пользовательскую табличную функцию для размещения вашего запроса, если вы не хотите повторять его явно.

...