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

Откуда:
Сообщений: 36
Хочу создать следующую хранимую процедуру:

CREATE PROCEDURE Get_HMS_All
@DateIn datetime,
@DateOut datetime
AS
SELECT * INTO #tmp FROM OPENQUERY
(
[SRV-HOTEL],
'SELECT * FROM [HMS].[db_pms].[f_1c_export] ('''+convert(varchar(8),@DateIn,112)+''','''+convert(varchar(8),@DateOut,112)+''')'
)

При её создании используется OPENQUERY, который со значениями должен выглядеть так:

OPENQUERY
(
[SRV-HOTEL],
'SELECT * FROM [HMS].[db_pms].[f_1c_export] (''20130901'',''20130901'')'
)

То есть значения дат должны быть заключены в две кавычки с обоих сторон.

Как это сдеалать в процедуре? Существующий вариант даёт ошибку:

Incorrect syntax near '+'

Как сделать две кавычки в процедуре?
5 сен 13, 16:53    [14800966]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с формированием строки для OPENQUERY  [new]
StJack
Member

Откуда:
Сообщений: 36
Если эту процедуру немного изменить:

ALTER PROCEDURE Get_HMS_All
@DateIn datetime,
@DateOut datetime
AS
SELECT 'SELECT *
FROM [HMS].[db_pms].[f_1c_export] ('''+convert(varchar(8),@DateIn,112)+''','''+convert(varchar(8),@DateOut,112)+''')'

а потом запустить:

exec Get_HMS_All '20130901','20130901'

то она выдаст следующее:

SELECT * FROM [HMS].[db_pms].[f_1c_export] ('20130901','20130901')

А нужны двойные кавычки вместо одинарных.
5 сен 13, 17:08    [14801025]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с формированием строки для OPENQUERY  [new]
tortoise
Member

Откуда: UK
Сообщений: 532
StJack
Если эту процедуру немного изменить:

ALTER PROCEDURE Get_HMS_All
@DateIn datetime,
@DateOut datetime
AS
SELECT 'SELECT *
FROM [HMS].[db_pms].[f_1c_export] ('''+convert(varchar(8),@DateIn,112)+''','''+convert(varchar(8),@DateOut,112)+''')'

а потом запустить:

exec Get_HMS_All '20130901','20130901'

то она выдаст следующее:

SELECT * FROM [HMS].[db_pms].[f_1c_export] ('20130901','20130901')

А нужны двойные кавычки вместо одинарных.


а почему не так:
ALTER PROCEDURE Get_HMS_All
@DateIn datetime,
@DateOut datetime
AS
SELECT 'SELECT *
FROM [HMS].[db_pms].[f_1c_export] ('''''+convert(varchar(8),@DateIn,112)+''''','''''+convert(varchar(8),@DateOut,112)+''''')'
5 сен 13, 17:27    [14801134]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с формированием строки для OPENQUERY  [new]
StJack
Member

Откуда:
Сообщений: 36
Выдаёт ту же самую ошибку:

Incorrect syntax near '+'
5 сен 13, 17:43    [14801221]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с формированием строки для OPENQUERY  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4540
StJack
Как сделать две кавычки в процедуре?

Пользуйтесь char(34)

declare @DateIn datetime, @DateOut datetime
select @DateIn = getdate(), @DateOut = getdate()
declare @query varchar(500) = 'SELECT * FROM [HMS].[db_pms].[f_1c_export] (' + char(34) +convert(varchar(8),@DateIn,112) + char(34) + ',' + char(34) + convert(varchar(8),@DateOut,112)+ char(34) + ')'
select @query
5 сен 13, 17:47    [14801236]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с формированием строки для OPENQUERY  [new]
StJack
Member

Откуда:
Сообщений: 36
Если, конечно, в полной версии процедуры писать. В сокращённой работает. Но мне нужно именно в OPENQUERY её использовать.
5 сен 13, 17:51    [14801263]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с формированием строки для OPENQUERY  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
CREATE PROCEDURE Get_HMS_All
 @DateIn datetime,
 @DateOut datetime
AS

EXEC ('SELECT * FROM OPENQUERY
([SRV-HOTEL],
''SELECT * FROM [HMS].[db_pms].[f_1c_export] ('''+convert(varchar(8),@DateIn,112)+''','''+convert(varchar(8),@DateOut,112)+'''))')
)
5 сен 13, 17:53    [14801276]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с формированием строки для OPENQUERY  [new]
StJack
Member

Откуда:
Сообщений: 36
Класс! Вы натолкнули меня на верную мысль!
Я немного Ваш скрипт переделал для короткого варианта:

ALTER PROCEDURE Get_HMS_All
@DateIn datetime,
@DateOut datetime
AS
SELECT 'SELECT * FROM [HMS].[db_pms].[f_1c_export] ('''+char(39)+convert(varchar(8),@DateIn,112)+char(39)+''','''+char(39)+convert(varchar(8),@DateOut,112)+char(39)+''')'

При его запуске:

EXEC Get_HMS_All '20130901','20130901'

Выдаётся:

SELECT * FROM [HMS].[db_pms].[f_1c_export] (''20130901'',''20130901'')

То, что надо!

Но если я потом эту идею для OPENQUERY использую:

ALTER PROCEDURE Get_HMS_All
@DateIn datetime,
@DateOut datetime
AS
SELECT * INTO #tmp FROM OPENQUERY
(
[SRV-HOTEL],
'SELECT * FROM [HMS].[db_pms].[f_1c_export] ('''+char(39)+convert(varchar(8),@DateIn,112)+char(39)+''','''+char(39)+convert(varchar(8),@DateOut,112)+char(39)+''')'
)

Опять вылазит ошибка:

Incorrect syntax near '+'

В чём же дело?
5 сен 13, 18:16    [14801368]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с формированием строки для OPENQUERY  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4540
Почему же char(39)????
5 сен 13, 18:18    [14801377]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с формированием строки для OPENQUERY  [new]
Гость333
Member

Откуда:
Сообщений: 3683
StJack
Опять вылазит ошибка:

Incorrect syntax near '+'

В чём же дело?

Дело в том, что в OPENQUERY можно использовать только строковые константы, и нельзя — переменные. LexusR вам дал вариант.
5 сен 13, 18:19    [14801382]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с формированием строки для OPENQUERY  [new]
Glory
Member

Откуда:
Сообщений: 104751
StJack
В чём же дело?

В том, что в хелпе ясно написано, что OPENQUERY не принимает в качестве параметров какие бы то ни было пересеменные или выражения
5 сен 13, 18:19    [14801384]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с формированием строки для OPENQUERY  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4540
Glory
StJack
В чём же дело?

В том, что в хелпе ясно написано, что OPENQUERY не принимает в качестве параметров какие бы то ни было пересеменные или выражения

Вариант 2 - сформировать динамический запрос со строкой типа ' OPENQUERY(.........)' и его скормить exec
5 сен 13, 18:23    [14801407]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с формированием строки для OPENQUERY  [new]
StJack
Member

Откуда:
Сообщений: 36
SQL2008
Почему же char(39)????


Потому что char(34) даёт одну двойную кавычку " (в верхнем регистре буква Э).
А char(39) даёт одну одинарную кавычку ' (в нижнем регистре буква Э).
Для OPENQUERY нужны две одинарные кавычки, как я понял.
5 сен 13, 18:26    [14801418]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с формированием строки для OPENQUERY  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4540
SQL2008
Вариант 2 - сформировать динамический запрос со строкой типа ' OPENQUERY(.........)' и его скормить exec

Читаю по диагонали... Это ровно то, что предложил LexusR!
5 сен 13, 18:30    [14801438]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с формированием строки для OPENQUERY  [new]
StJack
Member

Откуда:
Сообщений: 36
LexusR
CREATE PROCEDURE Get_HMS_All
 @DateIn datetime,
 @DateOut datetime
AS

EXEC ('SELECT * FROM OPENQUERY
([SRV-HOTEL],
''SELECT * FROM [HMS].[db_pms].[f_1c_export] ('''+convert(varchar(8),@DateIn,112)+''','''+convert(varchar(8),@DateOut,112)+'''))')
)


Вот так у меня:

ALTER PROCEDURE Get_HMS_All
@DateIn datetime,
@DateOut datetime
AS
EXEC ('SELECT * FROM OPENQUERY
([SRV-HOTEL],
''SELECT * FROM [HMS].[db_pms].[f_1c_export] ('''+convert(varchar(8),@DateIn,112)+''','''+convert(varchar(8),@DateOut,112)+''')')
)

Выдаёт ошибку:

Incorrect syntax near the keyword 'convert'.
5 сен 13, 18:37    [14801469]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с формированием строки для OPENQUERY  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
ALTER PROCEDURE Get_HMS_All
 @DateIn datetime,
 @DateOut datetime
AS
DECLARE @SQL VARCHAR(4000)
SET @SQL='SELECT * FROM OPENQUERY([SRV-HOTEL],''SELECT * FROM [HMS].[db_pms].[f_1c_export] ('''+convert(varchar(8),@DateIn,112)+''','''+convert(varchar(8),@DateOut,112)+''')'')'
EXEC(@SQL)
5 сен 13, 18:48    [14801509]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с формированием строки для OPENQUERY  [new]
StJack
Member

Откуда:
Сообщений: 36
LexusR
ALTER PROCEDURE Get_HMS_All
 @DateIn datetime,
 @DateOut datetime
AS
DECLARE @SQL VARCHAR(4000)
SET @SQL='SELECT * FROM OPENQUERY([SRV-HOTEL],''SELECT * FROM [HMS].[db_pms].[f_1c_export] ('''+convert(varchar(8),@DateIn,112)+''','''+convert(varchar(8),@DateOut,112)+''')'')'
EXEC(@SQL)


Процедура создаётся без ошибок.

При запуске:

EXEC Get_HMS_All '20130901','20130901'

Выдаётся ошибка:

Incorrect syntax near '20130901'
5 сен 13, 18:52    [14801537]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с формированием строки для OPENQUERY  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
ALTER PROCEDURE Get_HMS_All
 @DateIn datetime,
 @DateOut datetime
AS
DECLARE @SQL VARCHAR(4000)
SET @SQL='SELECT * FROM OPENQUERY([SRV-HOTEL],''SELECT * FROM [HMS].[db_pms].[f_1c_export] ('''''+convert(varchar(8),@DateIn,112)+''''','''''+convert(varchar(8),@DateOut,112)+''''')'')'
EXEC(@SQL)
5 сен 13, 18:57    [14801558]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с формированием строки для OPENQUERY  [new]
StJack
Member

Откуда:
Сообщений: 36
LexusR, завтра отпишусь. Конец рабочего дня. Спасибо огромное за помощь!
5 сен 13, 19:04    [14801588]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с формированием строки для OPENQUERY  [new]
StJack
Member

Откуда:
Сообщений: 36
LexusR, всё получилось, спасибо огромное!
6 сен 13, 11:57    [14803551]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с формированием строки для OPENQUERY  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
Удачи!
6 сен 13, 12:00    [14803561]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить