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

Откуда:
Сообщений: 123
С утра копаюсь с запросом. Что-то с кавычками ("Незакрытые кавычки в конце символьной строки "")
Вот сам запрос:

DECLARE @MAXY2 int, @MYSQLQUERY2 nvarchar(300)
SET @MAXY2        = COALESCE( (SELECT MAX(l.[id]) FROM [Data].[dbo].[modtracker] l),0)
SET @MYSQLQUERY2  = 'select b.id,b.crmid,b.module,b.whodid,b.changedon,b.status,d.fieldname,d.prevalue,d.postvalue from .modtracker_detail d
inner join modtracker_basic b on d.id=b.id 
 where d.fieldname in (''category'',''assigned_user_id'') and  b.module=''Contacts'' and b.changedon >= ''2015-10-01 00:00:01'' and b.id>'+RTRIM(@MAXY2)
SET @MYSQLQUERY2 = 'SELECT * FROM OPENQUERY (MYSQL_ANALYSISBD,''' + REPLACE(@MYSQLQUERY2, '''', '''''') + ''')'

INSERT INTO [Data].[dbo].[modtracker]  ([id],[crmid],[module],[whodid],[changedon],[status],[fieldname],[prevalue],[postvalue])
EXEC(@MYSQLQUERY2)


Запросы без кавычек в строковой переменной отрабатываются без проблем
Где нужно подправить, чтобы исправить?
15 фев 16, 16:44    [18819304]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
hulk77
Где нужно подправить, чтобы исправить?

Правило очень простое - каждая кавычка в кавычках должна быть удвоена.

А вам лучше прочитать в хелпе про процедуру sp_executesql
И про EXEC() тоже.
И научиться использовать параметры
15 фев 16, 16:48    [18819329]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
hulk77,
так покажи, что ты там нахомутал в @MYSQLQUERY2? 6 кавычек подряд - это сила
15 фев 16, 16:55    [18819388]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Вроде так должно быть:

DECLARE @SQL NVARCHAR(MAX)

SELECT @SQL = '
SELECT b.id, b.crmid, b.module, b.whodid, b.changedon, b.status, d.fieldname, d.prevalue, d.postvalue
FROM modtracker_detail AS d
JOIN modtracker_basic AS b ON d.id = b.id
WHERE d.fieldname IN (''category'', ''assigned_user_id'')
    AND b.module = ''Contacts''
    AND b.changedon >= ''2015-10-01 00:00:01''
    AND b.id > ' + ISNULL(CAST(MAX(id) AS VARCHAR(10)), '0')
FROM dbo.modtracker

--INSERT INTO dbo.modtracker ...
SELECT *
FROM OPENQUERY (MYSQL_ANALYSISBD, @SQL)

+ ".modtracker_detail" точка лишняя
15 фев 16, 16:57    [18819405]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
hulk77
Member

Откуда:
Сообщений: 123
AlanDenton, "ожидается string или text_lex"
15 фев 16, 18:56    [18820131]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
hulk77
Member

Откуда:
Сообщений: 123
Glory,
переписал запрос по этому примеру

DECLARE @MAXY2 int
SET @MAXY2        = COALESCE(cast ( (SELECT MAX(l.[id]) FROM [Data].[dbo].[modtracker] l) as nvarchar (10)),0)
EXECUTE  ('select b.id,b.crmid,b.module,b.whodid,b.changedon,b.status,d.fieldname,d.prevalue,d.postvalue from modtracker_detail d
inner join modtracker_basic b on d.id=b.id  where d.fieldname in (''category'',''assigned_user_id'') and  b.module=''Contacts'' and b.changedon >= ''2015-10-01 00:00:01'' and b.id > ?', @MAXY2) AT MYSQL_ANALYSISBD;


Запрос начинает выполняться, но через минуту
Поставщик OLE DB "STREAM" для связанного сервера "(null)" вернул сообщение "Произошли ошибки во время выполнения многошаговой операции OLE DB. По возможности, проверьте значения всех состояний OLE DB. Работа не выполнена.".
15 фев 16, 19:00    [18820142]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4406
hulk77, а этот сервер определен?
 ... AT MYSQL_ANALYSISBD;
15 фев 16, 19:11    [18820194]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4406
Что вернет запрос
SELECT *
FROM OPENQUERY (MYSQL_ANALYSISBD, 'SELECT * FROM modtracker_detail')
15 фев 16, 19:16    [18820213]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
hulk77
Member

Откуда:
Сообщений: 123
SQL2008
Что вернет запрос
SELECT *
FROM OPENQUERY (MYSQL_ANALYSISBD, 'SELECT * FROM modtracker_detail')


возвращает записи с таблицы modtracker_detail
15 фев 16, 19:23    [18820251]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
hulk77
Member

Откуда:
Сообщений: 123
SQL2008
hulk77, а этот сервер определен?
 ... AT MYSQL_ANALYSISBD;


да, это связанный сервер mysql
15 фев 16, 19:24    [18820255]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4406
А вариант от AlanDenton не пробовали?:

DECLARE @SQL NVARCHAR(MAX)

SELECT @SQL = '
SELECT b.id, b.crmid, b.module, b.whodid, b.changedon, b.status, d.fieldname, d.prevalue, d.postvalue
FROM modtracker_detail AS d
JOIN modtracker_basic AS b ON d.id = b.id
WHERE d.fieldname IN (''category'', ''assigned_user_id'')
    AND b.module = ''Contacts''
    AND b.changedon >= ''2015-10-01 00:00:01''
    AND b.id > ' + ISNULL(CAST(MAX(id) AS VARCHAR(10)), '0')
FROM dbo.modtracker

--INSERT INTO dbo.modtracker ...
SELECT *
FROM OPENQUERY (MYSQL_ANALYSISBD, @SQL)
15 фев 16, 19:32    [18820296]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
SQL2008, вроде как с ошибкой отрабатывает "ожидается string или text_lex". Хотя если честно ошибка мутная... :)
15 фев 16, 19:39    [18820320]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
SQL2008,

кавычки закрыть не может...
15 фев 16, 19:39    [18820321]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4406
Шыфл
SQL2008,

кавычки закрыть не может...


А что покажет

DECLARE @SQL NVARCHAR(MAX)

SELECT @SQL = '
SELECT b.id, b.crmid, b.module, b.whodid, b.changedon, b.status, d.fieldname, d.prevalue, d.postvalue
FROM modtracker_detail AS d
JOIN modtracker_basic AS b ON d.id = b.id
WHERE d.fieldname IN (''category'', ''assigned_user_id'')
    AND b.module = ''Contacts''
    AND b.changedon >= ''2015-10-01 00:00:01''
    AND b.id > ' + ISNULL(CAST(MAX(999) AS VARCHAR(10)), '0')
PRINT @SQL
15 фев 16, 19:46    [18820344]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
hulk77
Member

Откуда:
Сообщений: 123
SQL2008,

SELECT b.id, b.crmid, b.module, b.whodid, b.changedon, b.status, d.fieldname, d.prevalue, d.postvalue
FROM modtracker_detail AS d
JOIN modtracker_basic AS b ON d.id = b.id
WHERE d.fieldname IN ('category', 'assigned_user_id')
    AND b.module = 'Contacts'
    AND b.changedon >= '2015-10-01 00:00:01'
    AND b.id > 999
15 фев 16, 20:58    [18820571]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
hulk77
Member

Откуда:
Сообщений: 123
SQL2008,

SELECT b.id, b.crmid, b.module, b.whodid, b.changedon, b.status, d.fieldname, d.prevalue, d.postvalue
FROM modtracker_detail AS d
JOIN modtracker_basic AS b ON d.id = b.id
WHERE d.fieldname IN ('category', 'assigned_user_id')
    AND b.module = 'Contacts'
    AND b.changedon >= '2015-10-01 00:00:01'
    AND b.id > 999


http://prntscr.com/a3ngax
15 фев 16, 21:00    [18820578]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4406
hulk77
SQL2008,

SELECT b.id, b.crmid, b.module, b.whodid, b.changedon, b.status, d.fieldname, d.prevalue, d.postvalue
FROM modtracker_detail AS d
JOIN modtracker_basic AS b ON d.id = b.id
WHERE d.fieldname IN ('category', 'assigned_user_id')
    AND b.module = 'Contacts'
    AND b.changedon >= '2015-10-01 00:00:01'
    AND b.id > 999


http://prntscr.com/a3ngax


Вы точно уверены, что можете использовать переменную в OpenQuery???
Вам нужно сформировать всю строку запроса, включая "OPENQUERY"

DECLARE @SQL NVARCHAR(MAX)

SELECT @SQL = 'SELECT * FROM OPENQUERY (MYSQL_ANALYSISBD,'' 
SELECT b.id, b.crmid, b.module, b.whodid, b.changedon, b.status, d.fieldname, d.prevalue, d.postvalue
FROM modtracker_detail AS d
JOIN modtracker_basic AS b ON d.id = b.id
WHERE d.fieldname IN (''category'', ''assigned_user_id'')
    AND b.module = ''Contacts''
    AND b.changedon >= ''2015-10-01 00:00:01''
    AND b.id > '' + ISNULL(CAST(MAX(id) AS VARCHAR(10)), ''0'') 
FROM dbo.modtracker '')'

exec (@SQL)


Кавычки, возможно, придется уточнить
15 фев 16, 21:15    [18820616]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
hulk77
Member

Откуда:
Сообщений: 123
[quot SQL2008]
hulk77
SQL2008,

Вы точно уверены, что можете использовать переменную в OpenQuery???


Да, использовал, без кавычек выполнялся нормально
15 фев 16, 21:26    [18820655]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
invm
Member

Откуда: Москва
Сообщений: 9646
hulk77
hulk77
SQL2008,

Вы точно уверены, что можете использовать переменную в OpenQuery???


Да, использовал, без кавычек выполнялся нормально
Фантазируете. В openquery можно использовать только строковый литерал.
15 фев 16, 21:35    [18820698]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
hulk77
Member

Откуда:
Сообщений: 123
invm,

не обманываю. такой запрос работает
---------- tb_vtiger_modcomments
TRUNCATE TABLE [Data].[dbo].[modcomments]
DECLARE @MAXY1 int, @MYSQLQUERY1 nvarchar(300)
SET @MAXY1        = COALESCE( (SELECT MAX(l.[modcommentsid]) FROM [Data].[dbo].[modcomments] l),0)
SET @MYSQLQUERY1  = 'select modcommentsid,commentcontent,related_to,userid from modcomments where modcommentsid>'+RTRIM(@MAXY1)
SET @MYSQLQUERY1 = 'SELECT * FROM OPENQUERY (MYSQL_ANALYSISBD,''' + REPLACE(@MYSQLQUERY1, '''', '''''') + ''')'

INSERT INTO [Data].[dbo].[modcomments]  ([modcommentsid],[commentcontent],[related_to],[userid]) 
EXEC(@MYSQLQUERY1)


Но потребовалось добавить условия в where с кавычками и появились такие проблемы
15 фев 16, 22:30    [18820900]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
hulk77
не обманываю. такой запрос работает

Да, вы не обманываете
Вы просто не понимаете разницы, между запросом в переменной и переменной в запросе

hulk77
Но потребовалось добавить условия в where с кавычками и появились такие проблемы

дело не в кавычках.
Дело в том, что запрос внутри OPENQUERYдолжен быть написан на синтаксисе MySQL, а не MSSQL.
Потому что выполнять этот запрос будет MySQL, а не MSSQL
15 фев 16, 22:55    [18820998]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
hulk77
Member

Откуда:
Сообщений: 123
Glory, я и использую синтаксис, который выполняется на стороне mysql (на скрине этот же запрос выполняется)

Перестроил немного запрос
DECLARE @SQL NVARCHAR(MAX), @SQL2 NVARCHAR(MAX)

SELECT @SQL = '
SELECT b.id, b.crmid, b.module, b.whodid, b.changedon, b.status, d.fieldname, d.prevalue, d.postvalue
FROM modtracker_detail AS d
JOIN modtracker_basic AS b ON d.id = b.id
WHERE d.fieldname IN (''category'', ''assigned_user_id'')
    AND b.module = ''Contacts''
    AND b.changedon >= ''2015-10-01 00:00:01''
    AND b.id > ' + ISNULL(cast ( (SELECT MAX(l.[id]) FROM [Data].[dbo].[modtracker] l) as nvarchar (10)),0)

--INSERT INTO dbo.modtracker ...
SELECT @SQL2 = 'SELECT * FROM OPENQUERY (MYSQL_ANALYSISBD, ''' + @SQL + ''')'

PRINT @SQL2

EXEC(@SQL2)


SELECT * FROM OPENQUERY (MYSQL_ANALYSISBD, '
SELECT b.id, b.crmid, b.module, b.whodid, b.changedon, b.status, d.fieldname, d.prevalue, d.postvalue
FROM vtiger6_prod.vtiger_modtracker_detail AS d
JOIN vtiger6_prod.vtiger_modtracker_basic AS b ON d.id = b.id
WHERE d.fieldname IN ('category', 'assigned_user_id')
AND b.module = 'Contacts'
AND b.changedon >= '2015-10-01 00:00:01'
AND b.id > 0')

Но возникает ошибка "Неправильный синтаксис около конструкции "category"."
Если кто сможет подсказать, как изменить запрос, чтобы передать его на выполнение Mysql, буду очень благодарен

К сообщению приложен файл. Размер - 52Kb
16 фев 16, 11:07    [18822375]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
hulk77
Но возникает ошибка "Неправильный синтаксис около конструкции "category"."
Если кто сможет подсказать, как изменить запрос, чтобы передать его на выполнение Mysql, буду очень благодарен


Так заметнее ?
SELECT * FROM OPENQUERY (MYSQL_ANALYSISBD, '
SELECT b.id, b.crmid, b.module, b.whodid, b.changedon, b.status, d.fieldname, d.prevalue, d.postvalue
FROM vtiger6_prod.vtiger_modtracker_detail AS d
JOIN vtiger6_prod.vtiger_modtracker_basic AS b ON d.id = b.id
WHERE d.fieldname IN ('category', 'assigned_user_id')
    AND b.module = 'Contacts'
    AND b.changedon >= '2015-10-01 00:00:01'
    AND b.id > 0')
16 фев 16, 11:10    [18822397]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
hulk77
Member

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

к сожалению, нет

К сообщению приложен файл. Размер - 37Kb
16 фев 16, 11:55    [18822676]     Ответить | Цитировать Сообщить модератору
 Re: Кавычки в запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
hulk77
к сожалению, нет

Картинка с другого сайта.

Т.е. нужно опять рассказывать про правило удвоения кавчки внутри кавычек ?

SELECT * FROM OPENQUERY (MYSQL_ANALYSISBD, '
SELECT b.id, b.crmid, b.module, b.whodid, b.changedon, b.status, d.fieldname, d.prevalue, d.postvalue
FROM vtiger6_prod.vtiger_modtracker_detail AS d
JOIN vtiger6_prod.vtiger_modtracker_basic AS b ON d.id = b.id
WHERE d.fieldname IN (' - вот эта перва команда у вас

category', ' - вот эта вторая
assigned_user_id') AND b.module = ' - это третья и тд

Как вы думаете, эти команды верны синтаксически ?
16 фев 16, 11:58    [18822687]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить