Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Использование WITH  [new]
ferzmikk
Member

Откуда:
Сообщений: 2059
Здравствуйте!
+ Есть такой запрос. Он работает
Use БазаДанных1
Declare @StartDate date ='2017-10-01'


SELECT
	Таблица1.Поле1,
	Таблица1.Поле2,
	Таблица1.Поле3,
	Таблица1.Поле4,
	Таблица1.STARTDATE,
	Таблица1.ENDDATE,	
	Таблица2.Поле5,
	Таблица3.Поле6
FROM
	Таблица1
INNER JOIN
	Таблица2
ON
	Таблица1.Поле1=Таблица2.Поле1
INNER JOIN
	Таблица3
ON
	Таблица2.Поле5 = Таблица3.Поле5
WHERE
	Таблица1.Поле7 =1
	AND
	Таблица1.STARTDATE>=@StartDate

+ Если этот запрос затолкать в WITH качестве переменной
Use БазаДанных1
Declare @StartDate date ='2017-10-01'

WITH Таблица AS (
	SELECT
		Таблица1.Поле1,
		Таблица1.Поле2,
		Таблица1.Поле3,
		Таблица1.Поле4,
		Таблица1.STARTDATE,
		Таблица1.ENDDATE,	
		Таблица2.Поле5,
		Таблица3.Поле6
	FROM
		Таблица1
	INNER JOIN
		Таблица2
	ON
		Таблица1.Поле1=Таблица2.Поле1
	INNER JOIN
		Таблица3
	ON
		Таблица2.Поле5 = Таблица3.Поле5
	WHERE
		Таблица1.Поле7 =1
		AND
		Таблица1.STARTDATE>=@StartDate	
	)
	
SELECT
	*
FROM
	Таблица
то пишет "Неправильный синтаксис около ключевого слова "Use"."

Как правильно написать?
11 янв 18, 21:58    [21099151]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
xenix
Guest
ferzmikk,
Use БазаДанных1
GO

Declare @StartDate date ='2017-10-01';

...
11 янв 18, 22:11    [21099176]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
ferzmikk,

https://docs.microsoft.com/ru-ru/sql/t-sql/queries/with-common-table-expression-transact-sql
Если обобщенное табличное выражение используется в инструкции, являющейся частью пакета, то за инструкцией, стоящей перед ней, должен следовать символ точки с запятой.
11 янв 18, 22:11    [21099177]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
ferzmikk
Member

Откуда:
Сообщений: 2059
Спасибо!
11 янв 18, 22:16    [21099187]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
ferzmikk
Member

Откуда:
Сообщений: 2059
А вот случай с двумя WITH
+
Use БазаДанных1

GO

Declare @StartDate date ='2017-01-01';

WITH Таблица AS (
	...	
	)
	
GO

WITH ЕщеТаблица AS (
	...
       )
	
Select * FROM ЕщеТаблица

Результат выгрузился. Но выдает сообщение "Неправильный синтаксис около конструкции ")"." Перед GO WITH ЕщеТаблица AS выделяет ошибку. Если перед GO WITH ЕщеТаблица AS поставить точку с запятой, то такая же ошибка.

Почему так? Как правильно написать?
12 янв 18, 07:48    [21099673]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
хм-хм
Guest
вместо go with поставить запятую
12 янв 18, 07:52    [21099677]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
ferzmikk
Member

Откуда:
Сообщений: 2059
хм-хм
вместо go with поставить запятую
Теперь нормально. Спасибо!
12 янв 18, 07:55    [21099680]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
ferzmikk
Member

Откуда:
Сообщений: 2059
А если присутствует EXECUTE после WITH, то как надо писать?
2 фев 18, 11:02    [21159941]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
iap
Member

Откуда: Москва
Сообщений: 46981
ferzmikk
А если присутствует EXECUTE после WITH, то как надо писать?
CTE, которое, как известно, начинается с WITH,
является необязательной частью SELECTа, UPDATEа, DELETEа и MERGEа.
При чём тут EXECUTE?
2 фев 18, 11:44    [21160064]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
ferzmikk
Member

Откуда:
Сообщений: 2059
+Такой SQL-запрос совместимый с R
Use БазаДанных1
GO

Declare @Таблица table(
	[Поле1] varchar(6),
	[Поле2] integer
)
;
INSERT INTO
  @Таблица 
VALUES 
('Первый',1),
('Второй',2),
('Третий',3)
;

With Таблица2 AS (
	SELECT
		[Поле1],
		[Поле2],
		[Поле2]+10 AS [Поле3]
	FROM
		@Таблица)
;

EXECUTE sp_execute_external_script
  @language =N'R',
  @script=N'OutputDataSet<-InputDataSet',
  @input_data_1 =N'Таблица1'
  WITH RESULT SETS (([Поле1] varchar(6), [Поле2] integer, [Поле3] integer ));
GO
+Выдает ошибку.
Сообщение 102, уровень 15, состояние 1, строка 20
Неправильный синтаксис около конструкции ")".
Как тут правильно написать?
2 фев 18, 13:19    [21160390]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
ferzmikk,
никогда не читайте хелп, сразу на форум

https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql
автор
A CTE must be followed by a single SELECT, INSERT, UPDATE, or DELETE statement that references some or all the CTE columns. A CTE can also be specified in a CREATE VIEW statement as part of the defining SELECT statement of the view.
2 фев 18, 13:24    [21160431]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
ferzmikk
Member

Откуда:
Сообщений: 2059
Я правильно понимаю, что в EXECUTE нельзя передать табличную переменную?
+
Declare @Таблица table(
	[Поле1] varchar(6),
	[Поле2] integer
)
;
INSERT INTO
  @Таблица 
VALUES 
('Первый',1),
('Второй',2),
('Третий',3)
;

EXECUTE sp_execute_external_script
  @language =N'R',
  @script=N'OutputDataSet<-InputDataSet',
  @input_data_1 =N'@Таблица'
  WITH RESULT SETS (([Поле1] varchar(6), [Поле2] integer));
GO
5 фев 18, 09:15    [21165612]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5957
1. А каким боком это к with? Тем, что оно есть в with result sets? Тогда можно еще и хины обсудить - там тоже есть with.
2. Передать табличную переменную в процедуру/функцию вполне можно - в виде экземпляра UDTT.
5 фев 18, 09:27    [21165636]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3708
invm
ferzmikk,

https://docs.microsoft.com/ru-ru/sql/t-sql/queries/with-common-table-expression-transact-sql
Если обобщенное табличное выражение используется в инструкции, являющейся частью пакета, то за инструкцией, стоящей перед ней, должен следовать символ точки с запятой.


скоро будет обязательным ставить после каждой инструкции ;
5 фев 18, 09:48    [21165693]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
Добрый Э - Эх
Guest
Ролг Хупин
скоро будет обязательным ставить после каждой инструкции ;
надеюсь, на первых порах его сделают "условно обязательным", в зависимости от флагов трассировки или уровней совместимости? Иначе, много кода может встать колом....
5 фев 18, 10:01    [21165730]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
iap
Member

Откуда: Москва
Сообщений: 46981
Добрый Э - Эх
Ролг Хупин
скоро будет обязательным ставить после каждой инструкции ;
надеюсь, на первых порах его сделают "условно обязательным", в зависимости от флагов трассировки или уровней совместимости? Иначе, много кода может встать колом....
Уже очень давно об этом предупредили.
Призывали переписывать.
Так же, как и скобки в TOP().
5 фев 18, 11:43    [21166240]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
Добрый Э - Эх
Guest
iap,

Кто бы ещё прислушивался ко всему этому....
тут ведь как обычно: "гром не грянет - мужик не перекрестится".... :)
Как всегда разработка до последнего будет использовать старые крепко заученные подходы в создании своего кода.
5 фев 18, 12:08    [21166394]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
ну зная их это очень не скоро....


из злобных была заявка про нумерованные процедуры, дружно искоренили, и вроде ж до сих пор не запрещённые функционал, а там лет и лет :)
5 фев 18, 12:10    [21166405]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
ferzmikk
Member

Откуда:
Сообщений: 2059
Сон Веры Павловны
Передать табличную переменную в процедуру/функцию вполне можно - в виде экземпляра UDTT.
+Написал SQL-запрос так
CREATE TYPE LocationTableType AS TABLE (
	[Поле1] varchar(6),
	[Поле2] integer
);
GO

Declare @Таблица AS LocationTableType
;

INSERT INTO
  @Таблица 
VALUES 
('Первый',1),
('Второй',2),
('Третий',3)
;

DECLARE @SQL varchar(8000)
SET @SQL = 'SELECT * FROM  @Таблица'

EXECUTE (@SQL)
Выдает ошибку - Необходимо объявить табличную переменную "@Таблица".

Что тут не так?
5 фев 18, 13:25    [21166663]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
iap
Member

Откуда: Москва
Сообщений: 46981
ferzmikk
Что тут не так?
Разные области видимости.
Внутри DSQL внешние переменные неизвестны.
5 фев 18, 13:29    [21166677]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1369
ferzmikk,

Declare @Таблица AS LocationTableType
;

INSERT INTO
  @Таблица 
VALUES 
('Первый',1),
('Второй',2),
('Третий',3)
;

DECLARE @SQL nvarchar(max)
SET @SQL = N'SELECT * FROM  @Таблица'

--EXECUTE (@SQL)
exec sp_executesql
     @stmt = @sql,
     @params = N'@Таблица LocationTableType READONLY',
     @Таблица = @Таблица 
5 фев 18, 13:32    [21166682]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
iap
Member

Откуда: Москва
Сообщений: 46981
ferzmikk,

речь шла о передаче табличной переменной в аргументе процедуры или функции.
Где тут у вас процедура или функция?
Объявленная, замечу, именно с параметром созданного вами типа.
5 фев 18, 13:34    [21166689]     Ответить | Цитировать Сообщить модератору
 Re: Использование WITH  [new]
ferzmikk
Member

Откуда:
Сообщений: 2059
+А вот если так написать
Declare @Таблица table(
	[Поле1] varchar(6),
	[Поле2] integer
)
;
INSERT INTO
  @Таблица 
VALUES 
('Первый',1),
('Второй',2),
('Третий',3)
;

EXECUTE sp_execute_external_script
  @language =N'R',   
  @params = N'@Таблица LocationTableType READONLY',
  @Таблица = @Таблица,
  @input_data_1 =N'@Таблица',
  @script=N'OutputDataSet<-InputDataSet'
  WITH RESULT SETS (([Поле1] varchar(6), [Поле2] integer));
GO
+то выдает ошибку
Сообщение 39001, уровень 16, состояние 2, строка 1
Только инструкция SELECT поддерживается для запроса ввода данных в хранимой процедуре "sp_execute_external_script".
Сообщение 11536, уровень 16, состояние 1, строка 14
Не удалось выполнить инструкцию EXECUTE, поскольку в ее предложении WITH RESULT SETS указано 1 результирующих наборов, но во время выполнения инструкция отправила только 0 результирующих наборов.


+Если так написать
Declare @Таблица table(
	[Поле1] varchar(6),
	[Поле2] integer
)
;
INSERT INTO
  @Таблица 
VALUES 
('Первый',1),
('Второй',2),
('Третий',3)
;

EXECUTE sp_execute_external_script
  @language =N'R',   
  @params = N'@Таблица LocationTableType READONLY',
  @Таблица = @Таблица,
  @input_data_1 =N'SELECT * FROM @Таблица',
  @script=N'OutputDataSet<-InputDataSet'
  WITH RESULT SETS (([Поле1] varchar(6), [Поле2] integer));
GO
+то выдает такую ошибку
Сообщение 8144, уровень 16, состояние 2, строка 0
Для процедуры или функции указано слишком много аргументов.
Сообщение 11536, уровень 16, состояние 1, строка 14
Не удалось выполнить инструкцию EXECUTE, поскольку в ее предложении WITH RESULT SETS указано 1 результирующих наборов, но во время выполнения инструкция отправила только 0 результирующих наборов.
Здесь как надо правильно написать запрос? Порядок аргументов важен?
5 фев 18, 14:16    [21166868]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить