当前位置: 首页 > 面试题库 >

如何在SQL Server中使用OPENQUERY设置变量

乐成济
2023-03-14
问题内容

我正在尝试从表中读取数据。该表具有表名列表。

对于数据集的每一行,我想运行几个查询以提取数据并将其插入到临时表中。

这是我所做的

DECLARE @campName varchar(255);
DECLARE @sqlCommand varchar(1000);
DECLARE @sqlCommandMySQL varchar(1000);
DECLARE @LastRun varchar(60);
DECLARE @OPENQUERY varchar(1000);


DECLARE MY_CURSOR CURSOR 
  LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR 
SELECT LTRIM(RTRIM(CallListName)) AS CallListName
FROM [SMSQL1].[RDI_System].[dbo].[Campaigns]
WHERE dialer_campaign = 1 AND i3Server ='I3New' AND ClientID = 111 AND (EndDate IS NULL OR EndDate >= getdate() - 7)

OPEN MY_CURSOR
FETCH NEXT FROM MY_CURSOR INTO @campName
WHILE @@FETCH_STATUS = 0
BEGIN 
    --SET @LinkedServer = 'GUARDIAN';
    SET @OPENQUERY = 'SELECT @LastRun = lr FROM OPENQUERY(GUARDIAN,''';
    SET @sqlCommandMySQL = 'SELECT IFNULL(MAX(lastRun), DATE_SUB(NOW(), INTERVAL 7 DAY) ) AS lr
                            FROM guardian_dynamo.runtimes_i3
                            WHERE CampaignListName = "'+@campName+'" '')';

    print @OPENQUERY + @sqlCommandMySQL;

    EXEC(@OPENQUERY + @sqlCommandMySQL);


    SET @sqlCommand = ' INSERT INTO #finalList(Attemtps, CAMPAIGNNAME, FINISHCODE, CALLDATE, AGENTID, RDINotes, PHONE, MERCHANTAccount)
                        SELECT ATTEMPTS, CAMPAIGNNAME, FINISHCODE, CALLDATE, AGENTID, RDINotes, PHONE, MERCHANTAccount 
                        FROM [I3_IC4].[dbo].['+ @campName +']
                        WHERE CALLDATE > '''+@LastRun+''' AND ISNULL(status, ''C'') IN (''U'', ''E'', ''A'', ''F'')   ';
    EXEC (@sqlCommand);


    FETCH NEXT FROM MY_CURSOR INTO @campName
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR;

每次我运行此查询时,都会出现此错误

Msg 137, Level 15, State 1, Line 1
Must declare the scalar variable "@LastRun".

我不知道为什么,因为我在上面的代码中看到了在顶部声明此变量的原因。

取得输出print @OPENQUERY + @sqlCommandMySQL;并手动执行。它没有问题,并且该变量@LastRun将具有应有的datetime值。


问题答案:

您需要使用sp_executesql执行动态查询,可帮助您 output变量(@LastRun)

Declare @OPENQUERY Nvarchar(max), @sqlCommandMySQL Nvarchar(max), @OPENQUERYFINAL Nvarchar(max)
....
SET @OPENQUERY = 'SELECT @LastRun = lr FROM OPENQUERY(GUARDIAN,''';
SET @sqlCommandMySQL = 'SELECT IFNULL(MAX(lastRun), DATE_SUB(NOW(), INTERVAL 7 DAY) ) AS lr
                            FROM guardian_dynamo.runtimes_i3
                            WHERE CampaignListName = "'+@campName+'" '')';

    --print @OPENQUERY + @sqlCommandMySQL;
    SET @OPENQUERYFINAL = @OPENQUERY + @sqlCommandMySQL;

    EXEC sp_executesql @OPENQUERYFINAL, 
                       N'@LastRun varchar(10) OUTPUT',
                         @LastRun output

演示版

DECLARE @str VARCHAR(10),
        @sql NVARCHAR(max)

SET @sql= 'select @str=1 '

EXEC Sp_executesql
  @sql,
  N'@str varchar(10) OUTPUT',
  @str output

PRINT @str


 类似资料:
  • 这是我在INNO设置中的三个示例部分。我想在INI部分使用。我该怎么做?

  • 问题内容: 我正在尝试设置一个环境变量,然后将其读回以验证它是否确实被设置。 我有以下内容: 但是,它看起来总是空的,这意味着它可能设置不正确。 我的exec命令正确吗?javadocs声明它可以将字符串参数作为命令。 有任何想法吗? 问题答案: 这行不通。当您开始一个新过程时,该过程将收到环境 的副本 。然后,它对环境变量所做的任何更改都将在该副本中进行,并且在任何时候都不会对调用方可见。 您实

  • 问题内容: 对于多分支项目,我有一个声明性管道脚本,在该脚本中,我想读取文本文件并将结果存储为字符串变量,以供管道的后续步骤访问。使用摘要生成器,我尝试执行以下操作: 为此,这将是我的字符串。 在Jenkins控制台输出中出现错误: 我是否需要使用一个步骤来将Jenkins环境变量的输出设置为?如果是这样,怎么办? 谢谢 问题答案: 该错误是由于只允许您在指令中使用管道步骤。我知道一种解决方法是使

  • 这与本文有关,但不同之处在于我试图理解为什么我不能从地理定位的内部设置外部变量。getCurrentPosition 我似乎无法从中获得任何类型的返回值,也无法从中设置值。我只能从内部访问position对象。我已经试着把这个传进来了。 我用叉子叉了德里克-朕會功夫's fiddle并修改它:https://jsfiddle.net/TwoFistedJustice/c3qr29L7/1/ 这是另

  • 问题内容: 我需要在python脚本中设置一些环境变量,并且我希望从python调用的所有其他脚本(shell脚本)(将是子进程)来查看设置的环境变量。该值为数字。 如果这样做,它会抱怨说1必须是字符串。我也想知道一旦设置它,如何在python(在脚本的后半部分)中读取环境变量。 问题答案: 你可能需要考虑其他方面的代码健壮性; 当你将整数值的变量存储为环境变量时,请尝试 然后为了进行检索,请考虑

  • 问题内容: 如何从内部设置一些环境变量以与类似命令一起使用? 这是我目前所拥有的: 我想在启动脚本中设置环境变量(例如),同时仍然能够仅通过一个命令来启动应用程序。 问题答案: 在脚本命令中设置环境变量: 然后在您的应用中使用。 注意:确保它可以跨平台工作。如果只关心Mac / Linux,则可以忽略它。