我对使用SQL相当陌生,并且在理解旧查询并重新使用它方面有些困难。
在链接服务器上工作时,尤其是EXECUTE
和OPENQUERY
命令的实用程序。
我使用的代码可以正常工作,因为我没有创建它。但是在某些方面我不完全了解它是如何工作的。我将需要更好地了解它才能创建自己的请求。
我已经阅读过这样的文档(https://docs.microsoft.com/fr-fr/sql/t-sql/language-elements/execute-transact-sql?view=sql-server-2017),但是我仍然不能理解为什么在链接服务器上工作时需要EXEC
的原因。
EXEC('
SELECT Cell_id,
CAST(Trafic_Voix as float) as Trafic_Voix
FROM OPENQUERY(myperf_ora,''
SELECT Cell_id,
MAX( (TFTRALACC+THTRALACC)/360 ) as Trafic_voix
FROM VIRTUO.ERI_CELL_TF_CHAN_FR_TAB_V
WHERE tstamp BETWEEN '''''+@DATE_DE_DEBUT+''''' AND '''''+@DATE_DE_FIN+'''''
GROUP BY Cell_id
'')
')
如果那改变了我正在使用的Microsoft SQL Server Management Studio。
当我从查询中删除EXEC
时,它不再起作用并显示错误消息。我想知道为什么必须使用此命令?
与OPENQUERY
相同
答案 0 :(得分:0)
它正在运行动态SQL查询。此代码创建一个像SELECT Cell_id, MAX( (TFTRALACC+THTRALACC)/360 ) as Trafic_voix ...
这样的SQL查询,并执行它。 myperf_ora
光标可访问查询结果。
为什么需要它?由于DATE_DE_DEBUT
和DATE_DE_FIN
变量是查询中的参数,因此作者发现以这种方式将它们包含在查询中是最简单的。
当然,还有更优雅的方法。
答案 1 :(得分:0)
EXEC
(或EXECUTE
)用于执行动态生成的SQL语句。
此处给出的查询并不复杂。因此可以删除EXEC。但是,您必须用单个单引号(''
)替换(串联)字符串中的双单引号('
)。
因此,基本上,您要执行此操作:
SELECT
Cell_id,
CAST(Trafic_Voix as float) as Trafic_Voix
FROM
OPENQUERY(myperf_ora,'
SELECT Cell_id,
MAX( (TFTRALACC+THTRALACC)/360 ) as Trafic_voix
FROM VIRTUO.ERI_CELL_TF_CHAN_FR_TAB_V
WHERE tstamp BETWEEN ''' + @DATE_DE_DEBUT + ''' AND ''' + @DATE_DE_FIN + '''
GROUP BY Cell_id
')
编辑(以回复评论):
实际上...不可能。抱歉。 :(
似乎OPENQUERY行集函数仅接受第二个参数的字符串文字。这将使EXEC语句成为必需:这样,动态生成的SQL查询将包含OPENQUERY函数第二个参数的字符串文字。
Dan Guzman已经在您有关此问题的原始帖子中添加了一条评论。