【问题标题】:Can I return foreign key columns from table valued functions?我可以从表值函数返回外键列吗?
【发布时间】:2011-04-18 19:56:53
【问题描述】:

我想使用表值函数并从多个存储过程中调用它,而不是在所有存储过程中重复相同的查询,但为了与旧版 VB6/UltraGrid 应用程序兼容,我需要保留外键引用原始表格。

在表值函数中我可以指定一个PRIMARY KEY,但是有没有办法指定一个“外键”?我尝试像这样修改返回表,但出现语法错误:

ALTER TABLE @ReturnTable  
WITH CHECK ADD  CONSTRAINT [FK_ReturnTable_OtherTable]
FOREIGN KEY([OtherTableID])
REFERENCES [dbo].[OtherTable] ([OtherTableID])

【问题讨论】:

    标签: sql-server-2005 tsql user-defined-functions


    【解决方案1】:

    不,你不能。该函数返回一个仅在运行时存在的“虚拟”表,并且无法对这样一个虚构/瞬态的行集进行 FK。在不知道您的架构以及您想要完成的确切内容的情况下,我最好猜测它是尝试使用触发器来强制执行此操作。

    【讨论】:

    • 谢谢,我很怀疑,但我绝不是专家。目前我正在加入存储过程中的原始表以将 FK 列拉出,但这有点违背了目的。
    • 我建议只在每个存储过程中使用常规表和联接。使用这个函数可能会混淆优化器并导致错误的执行计划和执行缓慢的查询。 sql 的目标是使用查询获得快速索引。许多人陷入了试图通过删除重复和其他典型的应用程序代码效率低下来使 SQL 代码“流畅”的陷阱。这会导致 SQL 性能非常低效。我见过非常细微的 SQL 代码更改导致性能大幅下降。
    【解决方案2】:

    您的旧网格会通过视图查看 FK 关系吗?还是查询无法存储为视图?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 2016-08-08
      • 1970-01-01
      • 2021-09-19
      • 2021-12-23
      • 2020-04-11
      • 2018-09-25
      相关资源
      最近更新 更多