【问题标题】:Must declare the scalar variable @Table when using Linked server EXEC使用链接服务器 EXEC 时必须声明标量变量 @Table
【发布时间】:2016-06-06 20:53:04
【问题描述】:

我正在尝试执行连接链接服务器的 EXEC,但它无法使用表变量工作。

有什么解决办法吗?

我的代码:

DECLARE @Table TABLE(
    ID VARCHAR(8),
    DATA DATE,
    DIA VARCHAR(2),
    MES VARCHAR(2),
    ANO VARCHAR(4)
)

INSERT INTO @Table SELECT * FROM LOCALTABLE

EXEC ('INSERT INTO SERVER2TABLE SELECT * FROM ' + @Table) AT SERVER2;

错误:

Must declare the scalar variable "@Table".

我的服务器:

使用 MySQL ODBC 5.1 驱动程序 MySQL 5.6.8 的 SQL SERVER 2008 R2 LINKED SERVER

【问题讨论】:

  • 如果您想在 EXEC 语句的内部和外部与表变量进行交互,请参阅answer from Martin Smith
  • 请清楚地更新您的问题,您的问题和 cmets 的说法不同
  • 修复了这个问题。谢谢

标签: mysql sql sql-server linked-server


【解决方案1】:

您不能在动态 SQL 中使用类似的表变量,即使它不是链接服务器。 @Table 是一个表,而不是一个字符串,所以你不能只是将它附加到一个字符串。即使您将其用作名称,它仍然不起作用,因为该变量不再在 EXEC 的范围内。

您是否尝试过直接插入链接服务器?我相信语法是这样的:

INSERT INTO SERVER2...SERVER2TABLE (id, data, dia, mes, ano)
SELECT id, data, dia, mes, ano
FROM @Table

假设目标表 (SERVER2TABLE) 中的列名相同。

【讨论】:

  • 我今天直接插入。但问题在于,使用该命令“链接服务器”会在任何查询之前执行"select * server2table"。解决方案是使用exec 命令。这就是我尝试使用它的原因。
  • 我假设它正在做类似SELECT * FROM table WHERE 1=0 的事情,以便它可以获得表格的结构。它实际上并没有尝试提取完整的数据集。
  • 考虑一下。但是查看 MySQL 日志,查询会带来所有行(超过 2900 万行)并且需要 30 多分钟。
【解决方案2】:

尝试一次:我不确定您如何将数据填充到表变量中,但根据您的操作,这将起作用

EXEC ('
DECLARE @Table TABLE(
    ID VARCHAR(8),
    DATA DATE,
    DIA VARCHAR(2),
    MES VARCHAR(2),
    ANO VARCHAR(4)
)

INSERT INTO SERVER2TABLE SELECT * FROM  @Table') AT SERVER2;

【讨论】:

  • 仅供阅读的人参考...这里的@Table 与其余代码中声明的任何@Table 完全分开。字符串中的任何内容都在完全不同的范围内,因此其余代码中@Table 中的任何数据都将不可用。
  • 是的,这就是问题所在。我也在填充。
  • EXEC 是一个批处理分隔符,这是预期的,答案是针对 op 给出的
猜你喜欢
  • 2020-04-08
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
相关资源
最近更新 更多