powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Использование WITH
23 сообщений из 23, страница 1 из 1
Использование WITH
    #39582857
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!
Есть такой запрос. Он работает
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
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 качестве переменной
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
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"."

Как правильно написать?
...
Рейтинг: 0 / 0
Использование WITH
    #39582861
xenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ferzmikk,
Код: sql
1.
2.
3.
4.
5.
6.
Use БазаДанных1
GO

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

...
...
Рейтинг: 0 / 0
Использование WITH
    #39582862
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

https://docs.microsoft.com/ru-ru/sql/t-sql/queries/with-common-table-expression-transact-sql Если обобщенное табличное выражение используется в инструкции, являющейся частью пакета, то за инструкцией, стоящей перед ней, должен следовать символ точки с запятой.
...
Рейтинг: 0 / 0
Использование WITH
    #39582866
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!
...
Рейтинг: 0 / 0
Использование WITH
    #39582973
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот случай с двумя WITH
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Use БазаДанных1

GO

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

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

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


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

Почему так? Как правильно написать?
...
Рейтинг: 0 / 0
Использование WITH
    #39582974
хм-хм
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вместо go with поставить запятую
...
Рейтинг: 0 / 0
Использование WITH
    #39582975
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм-хмвместо go with поставить запятуюТеперь нормально. Спасибо!
...
Рейтинг: 0 / 0
Использование WITH
    #39595465
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если присутствует EXECUTE после WITH, то как надо писать?
...
Рейтинг: 0 / 0
Использование WITH
    #39595494
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkА если присутствует EXECUTE после WITH, то как надо писать?CTE, которое, как известно, начинается с WITH,
является необязательной частью SELECTа, UPDATEа, DELETEа и MERGEа.
При чём тут EXECUTE?
...
Рейтинг: 0 / 0
Использование WITH
    #39595566
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой SQL-запрос совместимый с R
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
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
Неправильный синтаксис около конструкции ")".
Как тут правильно написать?
...
Рейтинг: 0 / 0
Использование WITH
    #39595573
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Использование WITH
    #39596547
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я правильно понимаю, что в EXECUTE нельзя передать табличную переменную?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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

...
Рейтинг: 0 / 0
Использование WITH
    #39596553
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. А каким боком это к with? Тем, что оно есть в with result sets? Тогда можно еще и хины обсудить - там тоже есть with.
2. Передать табличную переменную в процедуру/функцию вполне можно - в виде экземпляра UDTT.
...
Рейтинг: 0 / 0
Использование WITH
    #39596564
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmferzmikk,

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

скоро будет обязательным ставить после каждой инструкции ;
...
Рейтинг: 0 / 0
Использование WITH
    #39596571
Ролг Хупинскоро будет обязательным ставить после каждой инструкции ;надеюсь, на первых порах его сделают "условно обязательным", в зависимости от флагов трассировки или уровней совместимости? Иначе, много кода может встать колом....
...
Рейтинг: 0 / 0
Использование WITH
    #39596634
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - ЭхРолг Хупинскоро будет обязательным ставить после каждой инструкции ;надеюсь, на первых порах его сделают "условно обязательным", в зависимости от флагов трассировки или уровней совместимости? Иначе, много кода может встать колом....Уже очень давно об этом предупредили.
Призывали переписывать.
Так же, как и скобки в TOP().
...
Рейтинг: 0 / 0
Использование WITH
    #39596652
iap,

Кто бы ещё прислушивался ко всему этому....
тут ведь как обычно: "гром не грянет - мужик не перекрестится".... :)
Как всегда разработка до последнего будет использовать старые крепко заученные подходы в создании своего кода.
...
Рейтинг: 0 / 0
Использование WITH
    #39596655
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну зная их это очень не скоро....


из злобных была заявка про нумерованные процедуры, дружно искоренили, и вроде ж до сих пор не запрещённые функционал, а там лет и лет :)
...
Рейтинг: 0 / 0
Использование WITH
    #39596717
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныПередать табличную переменную в процедуру/функцию вполне можно - в виде экземпляра UDTT.
Написал SQL-запрос так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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)

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

Что тут не так?
...
Рейтинг: 0 / 0
Использование WITH
    #39596722
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkЧто тут не так?Разные области видимости.
Внутри DSQL внешние переменные неизвестны.
...
Рейтинг: 0 / 0
Использование WITH
    #39596723
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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',
     @Таблица = @Таблица 
...
Рейтинг: 0 / 0
Использование WITH
    #39596726
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

речь шла о передаче табличной переменной в аргументе процедуры или функции.
Где тут у вас процедура или функция?
Объявленная, замечу, именно с параметром созданного вами типа.
...
Рейтинг: 0 / 0
Использование WITH
    #39596769
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот если так написать
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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 результирующих наборов.


Если так написать
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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 результирующих наборов.
Здесь как надо правильно написать запрос? Порядок аргументов важен?
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Использование WITH
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]