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

Откуда: Gardinas
Сообщений: 139
Пытаюсь написать запрос, который в дальнейшем хочу использовать в SSRS.

dECLARE @SQL varchar(8000), @dtBegin varchar(10)
SET @dtBegin='2011-08-01'
SET @SQL = 
'SELECT  *
	FROM 
		OPENROWSET(''SQLOLEDB'', ''192.168.12.1''; ''login''; ''password'', 
			 ''SELECT MONTH(dt) AS Month, SUM(SumIn) AS SumIn
		FROM
			(SELECT CONVERT(date, TimeRecord) AS dt, SUM(SumIn) AS SumIn, SUM(SumOut) AS SumOut
			FROM CM_StorageEnter
            GROUP BY CONVERT(date, TimeRecord)) AS DataByDate
		WHERE dt>=' + @dtBegin + 'AND dt<=''''2011-08-01''''
		GROUP BY MONTH(dt)'')'
exec(@SQL)

Но, он возвращает ошибку:
Поставщик OLE DB "SQLNCLI10" для связанного сервера "(null)" вернул сообщение "Deferred prepare could not be completed.".
Msg 8180, Level 16, State 1, Line 1
Statement(s) could not be prepared.
Msg 206, Level 16, State 2, Line 1
Operand type clash: date is incompatible with int

Кто-нибудь может подсказать в чем ошибка?
17 окт 11, 12:26    [11450410]     Ответить | Цитировать Сообщить модератору
 Re: openrowset + parameter  [new]
Glory
Member

Откуда:
Сообщений: 104751
print @SQL покажет вам текст того, что вы собрались выполнять
17 окт 11, 12:35    [11450489]     Ответить | Цитировать Сообщить модератору
 Re: openrowset + parameter  [new]
analysts
Member

Откуда: Gardinas
Сообщений: 139
Glory, спасибо.
Поправил, но все равно ошибка.
dECLARE @SQL varchar(8000), @dtBegin varchar(10)
SET @dtBegin=Convert(varchar, '2011-08-01')
SET @SQL = 
'SELECT  *
	FROM 
		OPENROWSET(''SQLOLEDB'', ''192.168.12.1''; ''login''; ''password'', 
			 ''SELECT MONTH(dt) AS Month, SUM(SumIn) AS SumIn
			FROM
			(SELECT CONVERT(date, TimeRecord) AS dt, SUM(SumIn) AS SumIn, SUM(SumOut) AS SumOut
			FROM CM_StorageEnter
            GROUP BY CONVERT(date, TimeRecord)) AS DataByDate
		WHERE dt>=' + @dtBegin + ' AND dt<=''''2011-08-01''''
		GROUP BY MONTH(dt)'')'
print @SQL
exec(@SQL)

Поставщик OLE DB "SQLNCLI10" для связанного сервера "(null)" вернул сообщение "Deferred prepare could not be completed.".
Msg 8180, Level 16, State 1, Line 1
Statement(s) could not be prepared.
Msg 206, Level 16, State 2, Line 1
Operand type clash: date is incompatible with int
17 окт 11, 12:40    [11450542]     Ответить | Цитировать Сообщить модератору
 Re: openrowset + parameter  [new]
Glory
Member

Откуда:
Сообщений: 104751
analysts
Поправил, но все равно ошибка.

Вы ответ точно прочитали ?
print @SQL НЕ исправит ошибку
Она позволит вам увидеть текст того, что вы собрались запускать
Чтобы вам легче было найти ошибку
17 окт 11, 12:46    [11450591]     Ответить | Цитировать Сообщить модератору
 Re: openrowset + parameter  [new]
analysts
Member

Откуда: Gardinas
Сообщений: 139
Glory, я понимаю и исправил запрос)
Pring возвращает следующую строку:
SELECT  *
	FROM 
		OPENROWSET('SQLOLEDB', '192.168.12.1'; 'login'; 'password', 
			 'SELECT MONTH(dt) AS Month, SUM(SumIn) AS SumIn
			FROM
			(SELECT CONVERT(date, TimeRecord) AS dt, SUM(SumIn) AS SumIn, SUM(SumOut) AS SumOut
			FROM CM_StorageEnter
            GROUP BY CONVERT(date, TimeRecord)) AS DataByDate
		WHERE dt>=2011-08-01 AND dt<=''2011-08-01''
		GROUP BY MONTH(dt)')
В нем не верна часть dt>=2011-08-01 (дата должна быть в двойных кавычках. Как её нужно исправить?
17 окт 11, 12:56    [11450719]     Ответить | Цитировать Сообщить модератору
 Re: openrowset + parameter  [new]
Glory
Member

Откуда:
Сообщений: 104751
analysts
В нем не верна часть dt>=2011-08-01 (дата должна быть в двойных кавычках. Как её нужно исправить?

Странный вопрос
dt>=2011-08-01 AND dt<=''2011-08-01''
как вторая дата оказалась в кавычках ?
17 окт 11, 12:58    [11450740]     Ответить | Цитировать Сообщить модератору
 Re: openrowset + parameter  [new]
analysts
Member

Откуда: Gardinas
Сообщений: 139
Glory, ну тупой я, поэтому и задаю странные вопросы)
Вторая дата оказалась в кавычках потому, что она включена в апострафы ''''2011-08-01''''', но если я тоже самое делаю с параметром, то он возвращает ошибку. Так же если вместо параметра поставить дату 2011-08-01, то все комбинации кавычек выдают ошибку. Может проблема в конкатенации?
17 окт 11, 13:04    [11450787]     Ответить | Цитировать Сообщить модератору
 Re: openrowset + parameter  [new]
Glory
Member

Откуда:
Сообщений: 104751
analysts
Вторая дата оказалась в кавычках потому, что она включена в апострафы ''''2011-08-01''''', но если я тоже самое делаю с параметром, то он возвращает ошибку.

Наверное потому, что апострофы должны быть в строке, а не вокруг переменной ?
17 окт 11, 13:13    [11450873]     Ответить | Цитировать Сообщить модератору
 Re: openrowset + parameter  [new]
analysts
Member

Откуда: Gardinas
Сообщений: 139
Glory, спасибо разобрался.
dECLARE @SQL varchar(8000), @dtBegin varchar(10)
SET @dtBegin='2011-08-01'
SET @SQL = 
'SELECT  *
	FROM 
		OPENROWSET(''SQLOLEDB'', ''192.168.12.1''; ''login''; ''password'', 
			 ''SELECT MONTH(dt) AS Month, SUM(SumIn) AS SumIn
			FROM
			(SELECT CONVERT(date, TimeRecord) AS dt, SUM(SumIn) AS SumIn, SUM(SumOut) AS SumOut
			FROM CM_StorageEnter
            GROUP BY CONVERT(date, TimeRecord)) AS DataByDate
		WHERE dt>=''''' + @dtBegin + ''''' AND dt<=''''' + '2011-08-01' + '''''
		GROUP BY MONTH(dt)'')'
print @SQL
exec(@SQL)
17 окт 11, 13:55    [11451381]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить