【问题标题】:Msg 207 Invalid column name $node_id for pseudo column in inline table valued function消息 207 无效的列名 $node_id 用于内联表值函数中的伪列
【发布时间】:2018-01-15 20:01:14
【问题描述】:

在节点表中,伪列名称 $node_id 指的是节点 ID 列的内部名称,建议使用伪列(参见 SQL Graph Architecture §Node Table)。

例如创建下表后:

create table [Sites](
[SiteName] NVarChar(max) NOT NULL,
[EndPoint] NVarChar(max),
[SiteNameHash] as CheckSum([SiteName]) PERSISTED NOT NULL,
[EndPointHash] as CheckSum([EndPoint]) PERSISTED NOT NULL,

INDEX IX_Sites_NodeId UNIQUE CLUSTERED ($node_id),
INDEX IX_Sites_SiteName UNIQUE NONCLUSTERED (SiteNameHash, $node_id),
INDEX IX_Sites_EndPoint UNIQUE NONCLUSTERED (EndPointHash, $node_id))

as Node;

查询:

SELECT $node_id
  ,[SiteName]
  ,[EndPoint]
  ,[SiteNameHash]
  ,[EndPointHash]
FROM [EmersonAnalysis].[dbo].[Sites]
where $node_id =  '{"type":"node","schema":"dbo","table":"Sites","id":0}'

使用SELECT-子句和WHERE-子句中的伪列$node_id 来选择单个节点(如果存在)。

但是,下表中的值函数:

create function SitesByName(
    @sitename as NVarChar(max))
RETURNS TABLE
WITH SCHEMABINDING
AS
    return select
        $node_id,
        [SiteName],
        [EndPoint],
        [SiteNameHash],
        [EndPointHash]
    from [dbo].[Sites]
    where [SiteNameHash] = CHECKSUM(@sitename) AND
        [SiteName] = @sitename;

类似查询:

select
    fn.$node_id
from [Sites]
outer apply SitesByName([SiteName]) as fn

导致错误消息:

消息 207,第 16 级,状态 1,第 2 行 列名“$node_id”无效。

从函数中选择列时是否可以使用伪列名?如果是这样,我该如何使用伪列名?

PS。我正在使用 RC 2 v14.0.900.75。

【问题讨论】:

标签: sql-server-2017 graph-databases sql-server-2017 sql-server-2017-graph


【解决方案1】:

Workarround:您可以在表值函数中为 $node_id 定义一个别名,并在您的选择中使用它而不是伪列:

ALTER function [dbo].[SitesByName](
    @sitename as NVarChar(max))
RETURNS TABLE
WITH SCHEMABINDING
AS
    return select
        $node_id [NodeId],
        [SiteName],
        [EndPoint],
        [SiteNameHash],
        [EndPointHash]
    from [dbo].[Sites]
    where [SiteNameHash] = CHECKSUM(@sitename) AND
        [SiteName] = @sitename;

如果事实SSMS[SitesByName] 下显示一条红色波浪线(可能是错误或警告)并带有以下文字:

没有为“SitesByName”的“1”列指定任何列

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多