Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 SQL Динамический запрос.  [new]
wiktor591
Member

Откуда:
Сообщений: 282
Добрый день, коллеги.

Подскажите пожалуйста.

У меня отчет без динамического запроса. Для своей задачи я переделал отчет в динамический запрос.

declare
@date1 datetime,
@date2 datetime,

select @date1 = ISNULL(@date1, '19900101 00:00'), @date2 = ISNULL(@date2, GETDATE())

exec (" ОТЧЕТ


and (ct.task_date between @date1 and @date2) --- вот тут у меня ругается. Пробовал уже "+@date1+" and "+@date2+" все равно ругается.

Как мне условие правильно написать?

")

Вот ошибка в первом случаи:

Msg 137, Level 15, State 2, Line 131
Must declare the scalar variable "@date1".

Вот во втором:

Msg 102, Level 15, State 1, Line 131
Incorrect syntax near '1'.

Спасибо, коллеги. С уважением.
27 май 13, 09:46    [14352227]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
aleks2
Guest
А почему бы не написать:
exec ("Хачу ОТЧЕТ")
27 май 13, 09:52    [14352261]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
wiktor591
select @date1 = ISNULL(@date1, '19900101 00:00'), @date2 = ISNULL(@date2, GETDATE())

exec (" ОТЧЕТ


and (ct.task_date between @date1 and @date2)")

Вот ошибка в первом случаи:

Msg 137, Level 15, State 2, Line 131
Must declare the scalar variable "@date1".

Вот во втором:

Msg 102, Level 15, State 1, Line 131
Incorrect syntax near '1'.

Спасибо, коллеги. С уважением.


Пришлите, пожалуйста, полный код после EXEC
27 май 13, 09:53    [14352266]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
ROLpogo
Member

Откуда: Реутов
Сообщений: 219
wiktor591,
1. Тут убрать запятую:
@date2	 datetime,


2. Сформировать строку запроса в переменной (например @sSQL varchar(8000)) и затем вызвать:

exec(@sSQL)
27 май 13, 09:58    [14352301]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
Сергей Викт.
Member

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

Это "кусок кода". Уверен, там дальше идёт объявление переменных, а чел из разряда шифровщиков типа "нимагу показать весь код"...
27 май 13, 10:02    [14352328]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
invm
Member

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

sp_executesql
Пример А.
27 май 13, 10:17    [14352409]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
на всякий случай
Guest
wiktor591,

Динамический запрос или "переменная @Tablename"
27 май 13, 10:18    [14352410]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
wiktor591
Member

Откуда:
Сообщений: 282
Коллеги, слово ОТЧЕТ там кусок кода.
27 май 13, 10:21    [14352433]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
wiktor591
Member

Откуда:
Сообщений: 282
Запятые тут не причем, я вам скинул только 2 переменные , а у меня их 10.

Вопрос в том. Как в динамическом запросе добавить условие с переменными?
27 май 13, 10:22    [14352442]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
wiktor591,

точно также как и в статическом. У вас переменные объявлены внутри строки, передаваемой в EXEC?
27 май 13, 10:29    [14352482]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
declare
	@date1 datetime,
	@date2 datetime

select @date1 = ISNULL(@date1, '19900101 00:00'), @date2 = ISNULL(@date2, GETDATE())

exec sp_executesql N'ОТЧЕТ
  and (ct.task_date between @date1 and @date2)', N'@date1 datetime, @date2 datetime', @date1, @date2
27 май 13, 10:29    [14352484]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
wiktor591
Member

Откуда:
Сообщений: 282
Вот вам пример:

DECLARE @date1 datetime,
@date2 datetime

select @date1 = '20130528 00:00'

select @date1 = ISNULL(@date1, '19900101 00:00'), @date2 = ISNULL(@date2, GETDATE())

exec ("
SELECT a1,a2,a3,a4,a5
FROM tab1
WHERE (a2 between @date1 and @date2)
")
27 май 13, 10:29    [14352486]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
wiktor591,

if OBJECT_ID(N'tempdb..#tab1') is null
	create table #tab1 (a2 date)

DECLARE @date1 datetime,
@date2 datetime

select @date1 = '20130528 00:00'

select @date1 = ISNULL(@date1, '19900101 00:00'), @date2 = ISNULL(@date2, GETDATE())

declare @sql varchar(8000)='
SELECT *
FROM #tab1
WHERE (a2 between '''+convert(varchar,@date1,112) +''' and '''+ convert(varchar,@date2,112)+''')
'

exec (@sql) 


а лучше используйте sp_executesql, как вам посоветовал Гость333
27 май 13, 10:41    [14352555]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
wiktor591
Вот вам пример:

DECLARE @date1 datetime,
@date2 datetime

select @date1 = '20130528 00:00'

select @date1 = ISNULL(@date1, '19900101 00:00'), @date2 = ISNULL(@date2, GETDATE())

exec ("
SELECT a1,a2,a3,a4,a5
FROM tab1
WHERE (a2 between @date1 and @date2)
")

DECLARE @date1 datetime,
@date2 datetime

DECLARE @sql varchar(max)
select @date1 = '20130528'
select @date2 = ISNULL(@date2, GETDATE())

SELECT @date1
SET @sql=N'SELECT a1,a2,a3,a4,a5
FROM tab1
WHERE (a2 between '''+CONVERT(varchar,@date1)+''' AND '''+CONVERT(varchar,@date2)+''')'

EXEC(@sql)
27 май 13, 10:41    [14352565]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
wiktor591
Member

Откуда:
Сообщений: 282
Сергей Викт.
wiktor591
Вот вам пример:

DECLARE @date1 datetime,
@date2 datetime

select @date1 = '20130528 00:00'

select @date1 = ISNULL(@date1, '19900101 00:00'), @date2 = ISNULL(@date2, GETDATE())

exec ("
SELECT a1,a2,a3,a4,a5
FROM tab1
WHERE (a2 between @date1 and @date2)
")

DECLARE @date1 datetime,
@date2 datetime

DECLARE @sql varchar(max)
select @date1 = '20130528'
select @date2 = ISNULL(@date2, GETDATE())

SELECT @date1
SET @sql=N'SELECT a1,a2,a3,a4,a5
FROM tab1
WHERE (a2 between '''+CONVERT(varchar,@date1)+''' AND '''+CONVERT(varchar,@date2)+''')'

EXEC(@sql)



Спасибо, но теперь пишет вот такую ошибку.

Msg 241, Level 16, State 1, Line 2
Conversion failed when converting date and/or time from character string.
27 май 13, 10:53    [14352659]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
wiktor591
Спасибо, но теперь пишет вот такую ошибку.

Msg 241, Level 16, State 1, Line 2
Conversion failed when converting date and/or time from character string.

Не используйте EXEC. Это прямой путь к SQL injection. Используйте sp_executesql.
27 май 13, 10:54    [14352670]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
wiktor591
Member

Откуда:
Сообщений: 282
Гость333,

Спасибо конечно, это нужно полностью переделывать отчет. А он такой большой.
( да и не когда этим методом не пользовался, нужно учиться )
27 май 13, 11:12    [14352828]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
wiktor591
нужно учиться

Учитесь сразу писать правильно, а не лепить г-код
27 май 13, 11:15    [14352853]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
wiktor591
Спасибо, но теперь пишет вот такую ошибку.

Msg 241, Level 16, State 1, Line 2
Conversion failed when converting date and/or time from character string.

DECLARE @date1 datetime,
 @date2 datetime
 
DECLARE @sql varchar(max)
select @date1 = '20130528'
select @date2 = ISNULL(@date2, GETDATE())

SELECT @date1
SET @sql=N'SELECT a1,a2,a3,a4,a5 
FROM tab1
 WHERE (a2 between '''+CONVERT(varchar,@date1,112)+''' AND '''+CONVERT(varchar,@date2,112)+''')'

EXEC(@sql) 
27 май 13, 11:16    [14352857]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
wiktor591,

А чего там переделывать-то? Вам нужно просто строку вашего запроса записать в переменную, потом эту переменную передать как параметр в sp_executesql, всё. Ну или посмотрите всё-таки, что я вам написал 14352555
27 май 13, 11:17    [14352875]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
AxuliON
Member

Откуда: оттуда, и на лыжах
Сообщений: 574
wiktor591
Спасибо, но теперь пишет вот такую ошибку.

Msg 241, Level 16, State 1, Line 2
Conversion failed when converting date and/or time from character string.


А у Вас дата в каком COLLATION на сервере лежит?
Может в Омереканском?

Тогда день и месяц перепутаны - используйте CONVERT
28-го месяца быть не может
И вообще строку в дату делать - ЗЛО!
27 май 13, 11:44    [14353087]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
wiktor591
Member

Откуда:
Сообщений: 282
Коллеги,

А если условие внутри у меня и есть еще второе условие.

Вот пример:

DECLARE
@sales_person int,
@date1 datetime,
@date2 datetime,
@K varchar(1000)

select @date1 = '20130528 00:00'

select @date1 = ISNULL(@date1, '19900101 00:00'), @date2 = ISNULL(@date2, GETDATE())

exec sp_executesql N'
SELECT a1,a2,a3,a4,a5
FROM tab1

'+@K+' - вот тут теперь пишет синтаксис не верный

WHERE
(ct.task_date between @date1 and @date2)', N'@date1 datetime, @date2 datetime', @date1, @date2

и тут тоже самое and (sp2.sales_person = @sales_person or @sales_person is null)', N'@sales_person int',@sales_person
27 май 13, 11:59    [14353207]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
iiyama
Member

Откуда:
Сообщений: 642
2TC, прежде чем лепить EXEC (@sql), в хороших кругах принято сначала сделать PRINT @sql и посмотреть на результат творчества
27 май 13, 12:01    [14353235]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
Glory
Member

Откуда:
Сообщений: 104751
wiktor591
вот тут теперь пишет синтаксис не верный

А вы ссылку на синтаксис sp_executesql открывали ? И предпочитаете находить правильный синтаксис на ощупь ?
27 май 13, 12:01    [14353237]     Ответить | Цитировать Сообщить модератору
 Re: SQL Динамический запрос.  [new]
AxuliON
Member

Откуда: оттуда, и на лыжах
Сообщений: 574
wiktor591,

С кавычками разберитесь сначала (это знак такой? выглядит вот так - ' )
27 май 13, 12:02    [14353245]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить