我喜欢在子句中使用表值函数,就像使用表一样。有没有办法做到这一点?MATCH
Node
对表值函数的需求
Node
将表值函数或视图用作表可以有多种用例。例如我的如下。
我有Node
包含NVarChar(max)
要搜索文字文本的字段的表。我只需要相等搜索而不需要全文搜索,所以我选择在文本字段的哈希值上使用索引。正如Remus Rusanu在他对SQL server 的回答中所建议的那样——值得索引大字符串键吗?和https://www.brentozar.com/archive/2013/05/indexing-wide-keys-in-sql-server/。表值函数使用CHECKSUM
索引处理;看消息 207 无效的列名 $node_id 用于内联表值函数中的伪列。
示例数据定义
CREATE TABLE [Tags](
[tag] NVarChar(max),
[tagHash] AS CHECKSUM([Tag]) PERSISTED NOT NULL
) as Node;
CREATE TABLE [Sites](
[endPoint] NVarChar(max),
[endPointHash] AS CHECKSUM([endPoint]) PERSISTED NOT NULL
) as Node;
CREATE TABLE [Links] as Edge;
CREATE INDEX [IX_TagsByName] ON [Tags]([tagHash]);
GO
CREATE FUNCTION [TagsByName](
@tag NVarChar(max))
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT
$node_id AS [NodeId],
[tag],
[tagHash]
FROM [dbo].[Tags]
WHERE [tagHash] = CHECKSUM(@tag) AND
[tag] = @tag;
[TagsByName]
返回https://stackoverflow.com/a/45565410/814206建议$node_id
的别名。但是,实际表包含另外两个我不知道如何导出的内部列。NodeId
Node
所需查询
我想查询类似这样的数据库:
SELECT *
FROM [TagsByName]('important') as t,
[Sites] as s,
[Links] as l
WHERE MATCH ([t]-([l])->[s])
但是,这会导致错误1 :
我有办法做到这一点吗?
PS。有一些解决方法,但它们看起来不像MATCH
-query 那样优雅;特别是考虑到我的实际查询涉及匹配更多的关系和更多的字符串相等测试。我会将这些解决方法作为答案发布,并希望有人提出更好的主意。
1 这给出了视图和表之间非常具体的区别,用于SQL 中视图和表之间的差异;这仅在sql-server-2017中发生并且仅在使用 SQL Graph 时发生。