命令EXECUTE代表什么?

时间:2019-05-06 10:32:24

标签: sql sql-server

我对使用SQL相当陌生,并且在理解旧查询并重新使用它方面有些困难。 在链接服务器上工作时,尤其是EXECUTEOPENQUERY命令的实用程序。

我使用的代码可以正常工作,因为我没有创建它。但是在某些方面我不完全了解它是如何工作的。我将需要更好地了解它才能创建自己的请求。

我已经阅读过这样的文档(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相同

2 个答案:

答案 0 :(得分:0)

它正在运行动态SQL查询。此代码创建一个像SELECT Cell_id, MAX( (TFTRALACC+THTRALACC)/360 ) as Trafic_voix ...这样的SQL查询,并执行它。 myperf_ora光标可访问查询结果。

为什么需要它?由于DATE_DE_DEBUTDATE_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已经在您有关此问题的原始帖子中添加了一条评论。