2017-08-08 37 views
0

在節點表中,僞列名稱$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}' 

使用僞列$node_idSELECT -clause並在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。我正在使用 RC 2 v14.0.900.75。

+0

有關僞列的信息,請參閱https://stackoverflow.com/q/195530/814206。 –

回答

0

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]下與文本:

無柱列指定的 '1' 的 'SitesByName'