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

Откуда:
Сообщений: 179
Добрый вечер!
если условие не выполняется, то переменная @_date_out остается пустой.
Почему возникает ошибка некорректный синтаксис?
Если так нельзя писать, то можно ли с помощью каких-то других конструкций такое написать?


DECLARE @SQLString NVARCHAR(4000);
DECLARE @ParmDefinition NVARCHAR(500);
DECLARE @_date_out NVARCHAR(200);
IF 1 = 1 --любое необходимое условие сейчас как пример
BEGIN 
 SET @_date_out = N' AND out_date = N''20990101''';
END
DECLARE @_count_auto_card_out INT;
SET @SQLString = N'SELECT @count_auto_card_out = COUNT(auto_card) FROM people WHERE 1 = 1  @date_out';
SET @ParmDefinition = N'@date_out NVARCHAR(2000), @count_auto_card_out INT OUTPUT';
SET @_date_out = N' AND out_date = N''20990101''';
exec sp_executesql
	@SQLString
	,@ParmDefinition
	,@date_out = @_date_out 
	,@count_auto_card_out = @_count_auto_card_out OUTPUT;
	select @_count_auto_card_out;
	print @SQLString;
5 апр 16, 16:37    [19019802]     Ответить | Цитировать Сообщить модератору
 Re: Если так нельзя писать, то можно ли с помощью каких-то других конструкций такое написать?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Nemoxur
Почему возникает ошибка некорректный синтаксис?

Потому что он некорректный
Параметризированный запрос не есть тоже самое, что динамический запрос.
Параметер - это не произвольный кусок текста запроса
5 апр 16, 16:40    [19019822]     Ответить | Цитировать Сообщить модератору
 Re: Если так нельзя писать, то можно ли с помощью каких-то других конструкций такое написать?  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
SET @SQLString = N'SELECT @count_auto_card_out = COUNT(auto_card) FROM people WHERE 1 = 1'+ISNULL(@date_out',N'');
5 апр 16, 16:43    [19019833]     Ответить | Цитировать Сообщить модератору
 Re: Если так нельзя писать, то можно ли с помощью каких-то других конструкций такое написать?  [new]
Nemoxur
Member

Откуда:
Сообщений: 179
Glory
Nemoxur
Почему возникает ошибка некорректный синтаксис?

Потому что он некорректный
Параметризированный запрос не есть тоже самое, что динамический запрос.
Параметер - это не произвольный кусок текста запроса


Мне раньше не приходилось заниматься динамическими запросами и параметризованным запросом
не совсем улавливаю разницу, теперь посыпались вопросы.
Я прочитал, вашу статью [url=Динамический запрос или переменная @Tablename]https://www.sql.ru/faq/faq_topic.aspx?fid=104[/url]
Стало более менее понятно. Статья была бы интереснее если бы там были пример динамического запроса с пролетаризированным запросом, если это конечно можно скрестить)


iap
SET @SQLString = N'SELECT @count_auto_card_out = COUNT(auto_card) FROM people WHERE 1 = 1'+ISNULL(@date_out',N'');


Спасибо за подсказку, только лишению ' убрал после ISNULL(@date_out
5 апр 16, 17:09    [19019960]     Ответить | Цитировать Сообщить модератору
 Re: Если так нельзя писать, то можно ли с помощью каких-то других конструкций такое написать?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Nemoxur
Статья была бы интереснее если бы там были пример динамического запроса с пролетаризированным запросом, если это конечно можно скрестить)

Динамический запрос не обладает своим особенным синтаксисом
У него такой же синтаксис, как и у нединамических запросов

Как вы думаете, где неправильный синтаксис в вашем запросе
SELECT @count_auto_card_out = COUNT(auto_card) FROM people WHERE 1 = 1  @date_out
5 апр 16, 17:13    [19019987]     Ответить | Цитировать Сообщить модератору
 Re: Если так нельзя писать, то можно ли с помощью каких-то других конструкций такое написать?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Glory,

так у него же
 SET @_date_out = N' AND out_date = N''20990101''';
5 апр 16, 17:15    [19019995]     Ответить | Цитировать Сообщить модератору
 Re: Если так нельзя писать, то можно ли с помощью каких-то других конструкций такое написать?  [new]
Glory
Member

Откуда:
Сообщений: 104760
TaPaK
Glory,

так у него же
 SET @_date_out = N' AND out_date = N''20990101''';

Потому, что он считает, что в динамическом запросе происходит замена подмена любой части запроса на значение переменной.
А такого функционала не существует нигде. Хоть в динамике, хоть без динамики
5 апр 16, 17:18    [19020011]     Ответить | Цитировать Сообщить модератору
 Re: Если так нельзя писать, то можно ли с помощью каких-то других конструкций такое написать?  [new]
Nemoxur
Member

Откуда:
Сообщений: 179
Glory
Nemoxur
Статья была бы интереснее если бы там были пример динамического запроса с пролетаризированным запросом, если это конечно можно скрестить)

Динамический запрос не обладает своим особенным синтаксисом
У него такой же синтаксис, как и у нединамических запросов

Как вы думаете, где неправильный синтаксис в вашем запросе
SELECT @count_auto_card_out = COUNT(auto_card) FROM people WHERE 1 = 1  @date_out


Между 1 = 1 @date_out

Я так понимаю, надо делать конкатенацию. Но я еще не совсем понимаю, как передать параметром
SET @_date_out = N' AND out_date = N''20990101''';
дату 2099-01-01 она может меняться.
5 апр 16, 17:20    [19020025]     Ответить | Цитировать Сообщить модератору
 Re: Если так нельзя писать, то можно ли с помощью каких-то других конструкций такое написать?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Nemoxur
Но я еще не совсем понимаю, как передать параметром

Еще раз
AND out_date = N''20990101' - это не параметер.
Вот параметер - N''20990101'
А AND out_date = - это часть текста запроса
5 апр 16, 17:23    [19020040]     Ответить | Цитировать Сообщить модератору
 Re: Если так нельзя писать, то можно ли с помощью каких-то других конструкций такое написать?  [new]
Nemoxur
Member

Откуда:
Сообщений: 179
Спасибо, Всем!
Разобрался, все получилось.
6 апр 16, 11:10    [19022197]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить