0

我在 Azure 中托管的服务器上有两个 SQL Azure 数据库 - DatabaseA 和 DatabaseB。

我需要从 DatabaseB 访问 DatabaseA 的视图——即我需要 DatabaseA 中的 sys.identity_columns 在 DatabaseB 上可供我使用。所以我在 DatabaseB 上创建了一个外部表,它链接到这样的信息(我没有包括所有列,但我包括了导致问题的列)

CREATE EXTERNAL TABLE [SOURCE_SYS].[identity_columns](
      [object_id] int not null
      ,[name] nvarchar(128) null
      ,[column_id] int not null
      ,[system_type_id] tinyint not null
      ,[seed_value] sql_variant null
    )
    WITH
    (
    DATA_SOURCE = MyElasticDBQueryDataSrc,
    SCHEMA_NAME = 'sys',
    OBJECT_NAME = 'identity_columns'
    );

当我运行它时 - 它有效。但是当我尝试使用结果时 - select * from [SOURCE_SYS].[identity_columns] - 我收到此错误:

消息 46823,级别 16,状态 1,第 50 行从 MyServer.database.windows.net.DatabaseA 检索数据时出错。收到的基本错误消息是:'索引超出范围。必须是非负数且小于集合的大小。参数名称:索引'。

如果我注释掉该表中具有 sql_variant 数据类型的字段 - 它可以正常工作,但我确实需要该字段中的信息以及同一个表中存在的其他两个 sql_variant 字段。MyElasticDBQueryDataSrc 在没有 sql_variant 类型的其他类似表上工作正常。

谁能建议我可能做错了什么?或者建议一个解决方法?我尝试使用 bigints,因为它主要是整数或 null 的种子值,但这不起作用,因为它告诉我它不是相同的数据类型。

非常感谢任何帮助。

4

1 回答 1

0

好吧 - 经过一个周末的睡眠后,我找到了答案!

如果您在外部表定义中使用 nvarchar(30) - 然后您可以在使用它的任何查询中将其转换为 bigint

CREATE EXTERNAL TABLE [SOURCE_SYS].[identity_columns](
      [object_id] int not null
      ,[name] nvarchar(128) null
      ,[column_id] int not null
      ,[system_type_id] tinyint not null
      ,[seed_value] nvarchar(30) null
    )
    WITH
    (
    DATA_SOURCE = MyElasticDBQueryDataSrc,
    SCHEMA_NAME = 'sys',
    OBJECT_NAME = 'identity_columns'
    );

现在我可以像这样访问值:

select cast(isnull([seed_value], 0) as bigint) from SOURCE_SYS.identity_columns

请注意,如果您执行 select * from - 您将需要与查询的其余部分分开执行变体 - 您将收到此错误:

消息 46825,级别 16,状态 1,第 58 行 外部表中列“seed_value”的数据类型不同于外部源上存在的基础独立表或分片表中列的数据类型。

希望这对某人有帮助!

于 2020-06-15T08:17:54.290 回答