如何在名称作为参数提供的用户定义函数中加入 table?
How to join a table within a user defined function whose name is provided as parameter?
上下文
我的 SQL 服务器数据库中有三个 table:1) 学校,2) 学院,3) 大学。
那我还有一个table:标签。
三个 table 中的每一个(学校、学院、大学)都可以有 标签 与之关联。为此,我有三个关联 tables:SchoolTags、CollegeTags、UniversityTags.
问题
我正在尝试创建一个用户定义的函数,它将关联名称 table 作为参数(即 'SchoolTags')和实体的 ID (school/college/university) return 与 entityId.
关联的标签列表
我遇到的问题是我必须加入 Tags 和一个 table,其名称将作为参数出现。为此,我正在创建一个动态查询。而且我们不能运行动态查询SQL服务器用户自定义函数。
问题
知道如何实现吗?
注意:我想要创建单独的关联 table,不想将它们转换为通用关联 table,并且我不想添加基于 If-Else
的关联关于我函数中的 table 个名称,这样如果创建了一个新的关联 table,我就不需要更新我的函数。
我正在使用 Microsoft SQL 服务器。
无论您使用什么语言,您都可能会使用 if
:
begin
if table = 'school' then
begin
. . .
end;
else if table = 'college' then
. . .
end;
确切的语法取决于您正在使用的数据库的脚本语言。
考虑在 one EducationInstitution table 和 one[ 的相关逻辑分组中规范化数据库=27=] JoinEducTags table。那些 table 听起来像是它们保持相同的结构但类型不同,因此应该保存在一个 table 中, 具有不同的 Type 字段学校、大学、大学等
然后,为所有三个集合之间的一对多关系添加必要的约束,primary/foreign 键:
您永远不想为每种新类型不断重构您的架构(即添加 tables)。使用这种方法,您的用户定义的函数只需要接收值参数而不是像 tables 这样的标识符,以便在动态查询中成为 运行。最后,这种方法可以通过高效存储更好地扩展。正如您将看到的,规范化可以节省复杂的查询。
你想要的是不可能的。您不能将 table 名称作为参数传递给 UDF,然后在 UDF 中使用动态 sql 创建并执行特定于作为参数传递的 table 的语句。您已经知道您别无选择,只能在您的 UDF 中使用 if-else 语句来实现您的目标 - 这是您对 "never having to update (or verify) your code when the schema changes" 的白日梦(是的 - 我改写了它以使您的问题更明显)那是一个问题。
可能还有其他方法可以实现一些有用的功能 - 但我建议您想得太远了,并且在没有明确目的的情况下尝试实现通用功能。这是一条非常困难且容易出问题的道路,需要复杂的 tsql 技能。
重申一下之前的回答,您遇到了架构问题。您特意创建了三个不同的实体 - 现在您想要一个通用函数来与它们中的任何一个一起使用。因此,在你花很多时间在这个特定方面之前,你应该花一些时间仔细考虑你打算如何使用(即,编写查询)这些 tables。如果您发现自己经常使用 union 将这些实体组合成一个公共结果集,那么您的实际业务可能与您的模型(架构)不匹配。
上下文
我的 SQL 服务器数据库中有三个 table:1) 学校,2) 学院,3) 大学。
那我还有一个table:标签。
三个 table 中的每一个(学校、学院、大学)都可以有 标签 与之关联。为此,我有三个关联 tables:SchoolTags、CollegeTags、UniversityTags.
问题
我正在尝试创建一个用户定义的函数,它将关联名称 table 作为参数(即 'SchoolTags')和实体的 ID (school/college/university) return 与 entityId.
关联的标签列表我遇到的问题是我必须加入 Tags 和一个 table,其名称将作为参数出现。为此,我正在创建一个动态查询。而且我们不能运行动态查询SQL服务器用户自定义函数。
问题
知道如何实现吗?
注意:我想要创建单独的关联 table,不想将它们转换为通用关联 table,并且我不想添加基于 If-Else
的关联关于我函数中的 table 个名称,这样如果创建了一个新的关联 table,我就不需要更新我的函数。
我正在使用 Microsoft SQL 服务器。
无论您使用什么语言,您都可能会使用 if
:
begin
if table = 'school' then
begin
. . .
end;
else if table = 'college' then
. . .
end;
确切的语法取决于您正在使用的数据库的脚本语言。
考虑在 one EducationInstitution table 和 one[ 的相关逻辑分组中规范化数据库=27=] JoinEducTags table。那些 table 听起来像是它们保持相同的结构但类型不同,因此应该保存在一个 table 中, 具有不同的 Type 字段学校、大学、大学等
然后,为所有三个集合之间的一对多关系添加必要的约束,primary/foreign 键:
您永远不想为每种新类型不断重构您的架构(即添加 tables)。使用这种方法,您的用户定义的函数只需要接收值参数而不是像 tables 这样的标识符,以便在动态查询中成为 运行。最后,这种方法可以通过高效存储更好地扩展。正如您将看到的,规范化可以节省复杂的查询。
你想要的是不可能的。您不能将 table 名称作为参数传递给 UDF,然后在 UDF 中使用动态 sql 创建并执行特定于作为参数传递的 table 的语句。您已经知道您别无选择,只能在您的 UDF 中使用 if-else 语句来实现您的目标 - 这是您对 "never having to update (or verify) your code when the schema changes" 的白日梦(是的 - 我改写了它以使您的问题更明显)那是一个问题。
可能还有其他方法可以实现一些有用的功能 - 但我建议您想得太远了,并且在没有明确目的的情况下尝试实现通用功能。这是一条非常困难且容易出问题的道路,需要复杂的 tsql 技能。
重申一下之前的回答,您遇到了架构问题。您特意创建了三个不同的实体 - 现在您想要一个通用函数来与它们中的任何一个一起使用。因此,在你花很多时间在这个特定方面之前,你应该花一些时间仔细考虑你打算如何使用(即,编写查询)这些 tables。如果您发现自己经常使用 union 将这些实体组合成一个公共结果集,那么您的实际业务可能与您的模型(架构)不匹配。