Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Правило очень простое - каждая кавычка в кавычках должна быть удвоена. А вам лучше прочитать в хелпе про процедуру sp_executesql И про EXEC() тоже. И научиться использовать параметры |
||
15 фев 16, 16:48 [18819329] Ответить | Цитировать Сообщить модератору |
Шыфл Member Откуда: Прага Сообщений: 776 |
hulk77, так покажи, что ты там нахомутал в @MYSQLQUERY2? 6 кавычек подряд - это сила |
15 фев 16, 16:55 [18819388] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
hulk77 Member Откуда: Сообщений: 123 |
AlanDenton, "ожидается string или text_lex" |
15 фев 16, 18:56 [18820131] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
SQL2008 Member Откуда: Москва Сообщений: 4406 |
hulk77, а этот сервер определен?... AT MYSQL_ANALYSISBD; |
15 фев 16, 19:11 [18820194] Ответить | Цитировать Сообщить модератору |
SQL2008 Member Откуда: Москва Сообщений: 4406 |
Что вернет запросSELECT * FROM OPENQUERY (MYSQL_ANALYSISBD, 'SELECT * FROM modtracker_detail') |
15 фев 16, 19:16 [18820213] Ответить | Цитировать Сообщить модератору |
hulk77 Member Откуда: Сообщений: 123 |
возвращает записи с таблицы modtracker_detail |
||
15 фев 16, 19:23 [18820251] Ответить | Цитировать Сообщить модератору |
hulk77 Member Откуда: Сообщений: 123 |
да, это связанный сервер mysql |
||
15 фев 16, 19:24 [18820255] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
AlanDenton Member [скрыт] Откуда: Сообщений: 1004 |
SQL2008, вроде как с ошибкой отрабатывает "ожидается string или text_lex". Хотя если честно ошибка мутная... :) |
15 фев 16, 19:39 [18820320] Ответить | Цитировать Сообщить модератору |
Шыфл Member Откуда: Прага Сообщений: 776 |
SQL2008, кавычки закрыть не может... |
15 фев 16, 19:39 [18820321] Ответить | Цитировать Сообщить модератору |
SQL2008 Member Откуда: Москва Сообщений: 4406 |
А что покажет 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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
SQL2008 Member Откуда: Москва Сообщений: 4406 |
Вы точно уверены, что можете использовать переменную в 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] Ответить | Цитировать Сообщить модератору |
hulk77 Member Откуда: Сообщений: 123 |
[quot SQL2008]
Да, использовал, без кавычек выполнялся нормально |
||
15 фев 16, 21:26 [18820655] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9646 |
|
||||
15 фев 16, 21:35 [18820698] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Да, вы не обманываете Вы просто не понимаете разницы, между запросом в переменной и переменной в запросе
дело не в кавычках. Дело в том, что запрос внутри OPENQUERYдолжен быть написан на синтаксисе MySQL, а не MSSQL. Потому что выполнять этот запрос будет MySQL, а не MSSQL |
||||
15 фев 16, 22:55 [18820998] Ответить | Цитировать Сообщить модератору |
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, ' Но возникает ошибка "Неправильный синтаксис около конструкции "category"." Если кто сможет подсказать, как изменить запрос, чтобы передать его на выполнение Mysql, буду очень благодарен К сообщению приложен файл. Размер - 52Kb |
16 фев 16, 11:07 [18822375] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Так заметнее ? 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] Ответить | Цитировать Сообщить модератору |
hulk77 Member Откуда: Сообщений: 123 |
Glory, к сожалению, нет К сообщению приложен файл. Размер - 37Kb |
16 фев 16, 11:55 [18822676] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Т.е. нужно опять рассказывать про правило удвоения кавчки внутри кавычек ? 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 | ![]() |