消息 207 内联 table 值函数中伪列的无效列名称 $node_id
Msg 207 Invalid column name $node_id for pseudo column in inline table valued function
在 Node-table 中,伪列名称 $node_id
指的是节点 ID 列的内部名称,建议使用伪列(参见 SQL Graph Architecture §Node Table)。
例如在创建以下 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
到 select 单个节点(如果存在)。
但是,在下面的 table 值函数上:
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
错误信息中的结果:
Msg 207, Level 16, State 1, Line 2
Invalid column name '$node_id'.
从函数中 selecting 列时是否可以使用伪列名?如果是这样,如何使用伪列名?
PS。我正在使用 sql-server-2017 RC 2 v14.0.900.75.
解决方法:您可以在 table 值函数中为 $node_id
定义一个别名,并在 select 中使用它而不是伪列:
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]
下显示红色波浪线(可能是错误或警告),文本为:
No column was specified for column '1' of 'SitesByName'
在 Node-table 中,伪列名称 $node_id
指的是节点 ID 列的内部名称,建议使用伪列(参见 SQL Graph Architecture §Node Table)。
例如在创建以下 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
到 select 单个节点(如果存在)。
但是,在下面的 table 值函数上:
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
错误信息中的结果:
Msg 207, Level 16, State 1, Line 2 Invalid column name '$node_id'.
从函数中 selecting 列时是否可以使用伪列名?如果是这样,如何使用伪列名?
PS。我正在使用 sql-server-2017 RC 2 v14.0.900.75.
解决方法:您可以在 table 值函数中为 $node_id
定义一个别名,并在 select 中使用它而不是伪列:
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]
下显示红色波浪线(可能是错误或警告),文本为:
No column was specified for column '1' of 'SitesByName'