我想在外部 table Azure SQL 中使用 SQL_VARIANT 数据类型,我得到了 "Index was out of range error."

I want to use SQL_VARIANT datatype in external table Azure SQL and I get the "Index was out of range error."

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

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

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 * 来自 [SOURCE_SYS].[identity_columns] - 我得到这个错误:

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

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

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

非常感谢任何帮助。

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

如果您在外部 table 定义中使用 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 行 外部 table 中列 'seed_value' 的数据类型与外部源上存在的基础独立或分片 table 中列的数据类型不同。

希望对大家有所帮助!