尝试在远程服务器上的查询中使用变量时出现语法错误
Syntax error trying to use a variable in my query on a remote server
我想使用链接服务器在 MSSQL 中查询 MySql 数据库,但是我一直收到此错误:
消息 102,级别 15,状态 1,过程 uspGetTimeLog,第 16 行
“+”附近的语法不正确。
下面是sql代码
SELECT * FROM OPENQUERY([MYSQLCONN],
'SELECT e_id, TDate, Entry, `Exit` FROM timemgt.daymaster
WHERE TDate >= ''''' + @frmDate + ''''' ')
这是有效的
SELECT * FROM OPENQUERY([MYSQLCONN],
'SELECT e_id, TDate, TIME_FORMAT(Entry, ''%T'') AS ''Entry'',
TIME_FORMAT(`Exit`, ''%T'') AS ''Exit'' FROM timemgt.daymaster
WHERE TDate >= ''2017-01-01'' AND TDate <= ''2017-01-01''')
这不起作用
DECLARE @frmDate VARCHAR(10)
DECLARE @toDate VARCHAR(10)
SET @frmDate = '2017-01-01'
SET @toDate = '2017-01-01'
SELECT * FROM OPENQUERY([MYSQLCONN],
'SELECT e_id, TDate, TIME_FORMAT(Entry, ''%T'') AS ''Entry'',
TIME_FORMAT(`Exit`, ''%T'') AS ''Exit'' FROM timemgt.daymaster
WHERE TDate >=''' + @frmDate + ''' AND TDate <= '''+ @toDate +'''')
获取错误
Msg 102, Level 15, State 1, Line 9 Incorrect syntax near '+'.
之后我会把它传给一个临时的table
我做类似的事情,但不是 MySQL。但是,我怀疑它也适用于 MySQL。
而不是这个:
WHERE TDate >= ''''' + @frmDate + '''''
你想要这样的东西:
WHERE TDate >= ' + @frmDateString + '
其中 @frmDateString
是这种格式的字符串。
{ts 'yyyy-mm-dd HH:mm:ss'}
您将不得不试验引号的数量。我做的事情也和你有点不同。我的技术是:
declare @sql as nvarchar(max);
set @sql = 'select * from openquery(
SERVERNAME,
''
select etc
where SomeDateField > = ' + @dateString + '
etc
''
)
';
exec sp_executesql @sql;
意义在于我的方法需要更多的单引号。
同样重要的是,我使用标量函数将我的日期转换为格式正确的字符串。
编辑从这里开始
发布此答案后,我阅读了有关存储过程的评论。你会想用我的方法。
我想使用链接服务器在 MSSQL 中查询 MySql 数据库,但是我一直收到此错误: 消息 102,级别 15,状态 1,过程 uspGetTimeLog,第 16 行 “+”附近的语法不正确。
下面是sql代码
SELECT * FROM OPENQUERY([MYSQLCONN],
'SELECT e_id, TDate, Entry, `Exit` FROM timemgt.daymaster
WHERE TDate >= ''''' + @frmDate + ''''' ')
这是有效的
SELECT * FROM OPENQUERY([MYSQLCONN],
'SELECT e_id, TDate, TIME_FORMAT(Entry, ''%T'') AS ''Entry'',
TIME_FORMAT(`Exit`, ''%T'') AS ''Exit'' FROM timemgt.daymaster
WHERE TDate >= ''2017-01-01'' AND TDate <= ''2017-01-01''')
这不起作用
DECLARE @frmDate VARCHAR(10)
DECLARE @toDate VARCHAR(10)
SET @frmDate = '2017-01-01'
SET @toDate = '2017-01-01'
SELECT * FROM OPENQUERY([MYSQLCONN],
'SELECT e_id, TDate, TIME_FORMAT(Entry, ''%T'') AS ''Entry'',
TIME_FORMAT(`Exit`, ''%T'') AS ''Exit'' FROM timemgt.daymaster
WHERE TDate >=''' + @frmDate + ''' AND TDate <= '''+ @toDate +'''')
获取错误
Msg 102, Level 15, State 1, Line 9 Incorrect syntax near '+'.
之后我会把它传给一个临时的table
我做类似的事情,但不是 MySQL。但是,我怀疑它也适用于 MySQL。
而不是这个:
WHERE TDate >= ''''' + @frmDate + '''''
你想要这样的东西:
WHERE TDate >= ' + @frmDateString + '
其中 @frmDateString
是这种格式的字符串。
{ts 'yyyy-mm-dd HH:mm:ss'}
您将不得不试验引号的数量。我做的事情也和你有点不同。我的技术是:
declare @sql as nvarchar(max);
set @sql = 'select * from openquery(
SERVERNAME,
''
select etc
where SomeDateField > = ' + @dateString + '
etc
''
)
';
exec sp_executesql @sql;
意义在于我的方法需要更多的单引号。
同样重要的是,我使用标量函数将我的日期转换为格式正确的字符串。
编辑从这里开始
发布此答案后,我阅读了有关存储过程的评论。你会想用我的方法。