Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Потому что он некорректный Параметризированный запрос не есть тоже самое, что динамический запрос. Параметер - это не произвольный кусок текста запроса |
||
5 апр 16, 16:40 [19019822] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Nemoxur Member Откуда: Сообщений: 179 |
Мне раньше не приходилось заниматься динамическими запросами и параметризованным запросом не совсем улавливаю разницу, теперь посыпались вопросы. Я прочитал, вашу статью [url=Динамический запрос или переменная @Tablename]https://www.sql.ru/faq/faq_topic.aspx?fid=104[/url] Стало более менее понятно. Статья была бы интереснее если бы там были пример динамического запроса с пролетаризированным запросом, если это конечно можно скрестить)
Спасибо за подсказку, только лишению ' убрал после ISNULL(@date_out |
||||||
5 апр 16, 17:09 [19019960] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Динамический запрос не обладает своим особенным синтаксисом У него такой же синтаксис, как и у нединамических запросов Как вы думаете, где неправильный синтаксис в вашем запросе SELECT @count_auto_card_out = COUNT(auto_card) FROM people WHERE 1 = 1 @date_out |
||
5 апр 16, 17:13 [19019987] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
Glory, так у него же SET @_date_out = N' AND out_date = N''20990101'''; |
5 апр 16, 17:15 [19019995] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Потому, что он считает, что в динамическом запросе происходит замена подмена любой части запроса на значение переменной. А такого функционала не существует нигде. Хоть в динамике, хоть без динамики |
||
5 апр 16, 17:18 [19020011] Ответить | Цитировать Сообщить модератору |
Nemoxur Member Откуда: Сообщений: 179 |
Между 1 = 1 @date_out Я так понимаю, надо делать конкатенацию. Но я еще не совсем понимаю, как передать параметром SET @_date_out = N' AND out_date = N''20990101''';дату 2099-01-01 она может меняться. |
||||
5 апр 16, 17:20 [19020025] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Еще раз AND out_date = N''20990101' - это не параметер. Вот параметер - N''20990101' А AND out_date = - это часть текста запроса |
||
5 апр 16, 17:23 [19020040] Ответить | Цитировать Сообщить модератору |
Nemoxur Member Откуда: Сообщений: 179 |
Спасибо, Всем! Разобрался, все получилось. |
6 апр 16, 11:10 [19022197] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |