Msg 207 Неверное имя столбца $node_id для псевдостолбца во встроенной табличной функции

В Node-таблице имя псевдостолбца $node_id ссылается на внутреннее имя столбца идентификатора узла; рекомендуется использовать псевдостолбец (см. таблицу узлов архитектуры SQL §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}'

использует псевдостолбец $node_id в SELECTи в WHERE-clause, чтобы выбрать один узел (если он существует).

Однако по следующей табличной функции:

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. Я использую /questions/tagged/sql-server-2017 RC 2 v14.0.900.75.

1 ответ

Решение

Обходной путь: вы можете определить псевдоним для $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] с текстом:

Не указан столбец для столбца "1" в "SitesByName"

Другие вопросы по тегам