【问题标题】:SQL Server : create dynamically queries to select all related data in DB based on entry table and IDSQL Server:创建动态查询以根据条目表和 ID 选择数据库中的所有相关数据
【发布时间】:2015-10-19 00:28:47
【问题描述】:

我的任务是创建一个 SQL 语句,该语句将创建(并运行?)多个其他查询,这些查询将选择从给定 ID(唯一标识符)和给定表名传出的所有相关数据。

它不必那么快,但它应该能够针对每个 db 使用,只需要 1 个 ID 和表名。

在数据库中,有一些 1:n、n:m 等关系,并不是每个表都有一个名为 Id 的列,有些只有外键,它必须是完全动态和通用的。

我试图自己实现它,但我的 SQL 不是那么好,我还尝试了一些其他脚本,它们将返回主外键关系,但我被困在那里,所以我以为你伙计们可能会帮助我:)

要返回,我需要(最好)生成的查询,我可以对数据库运行这些查询并返回所有信息(还有其他好的返回可能性吗?)

另外,我可以用 C# 创建这个项目,但我也陷入了尝试。

我将不胜感激任何形式的帮助:)

【问题讨论】:

  • 示例数据、表结构和所需的输出?
  • 你试过什么?您的架构是什么样的?你真的了解 SQL 或 LINQ 吗?
  • 我没有样本数据。想象一下任何数据库结构。我有多个表,它们是相关的,有的更多,有的更少。给定的是特定表中特定列的 ID。为此,我需要找到所有相关数据。而对于相关数据的相关数据等等。我认为,最好的输出是我可以对数据库运行的查询。我已经尝试了一些脚本,它们将返回主外键关系并尝试使用它来完成任务,但我做不到。
  • @ Sippy 我试图生成一个查询,它将所有信息连接在一起,由于查询中表名的多重定义,我无法处理,因为 pc 没有'不知道在查询的哪一行发生多个时要使用的表的哪一个实例sql) 我知道 SQl、MySQL、LINQ 的基础知识(选择/插入/更新和大多数连接,但我显然不是专家)

标签: sql sql-server database recursion


【解决方案1】:

以下将生成一组查询,然后可以将其粘贴到 ssms 中并执行。

您需要指定您感兴趣的表、列和 id 值。

另外请注意,这可能需要调整以使用模式等,并且您可以执行带有游标返回的 SQL,我相信这会让您走上正确的轨道:

DECLARE @idvalue int = 1
DECLARE @colName nvarchar(max) = 'myid'
DECLARE @tableName nvarchar(max) = 'Table_1'

DECLARE @tmp_Accounts TABLE (
PKTABLE_QUALIFIER sysname
,PKTABLE_OWNER sysname
,PKTABLE_NAME sysname
,PKCOLUMN_NAME sysname
,FKTABLE_QUALIFIER sysname
,FKTABLE_OWNER sysname
,FKTABLE_NAME sysname
,FKCOLUMN_NAME sysname
,KEY_SEQ smallint
,UPDATE_RULE smallint
,DELETE_RULE smallint
,FK_NAME nvarchar(max)
,PK_NAME nvarchar(max)
,deferrability smallint
)

insert into @tmp_Accounts exec sp_fkeys @tableName

select 
    'select * from ['+FKTABLE_NAME+'] where ['+FKCOLUMN_NAME+'] = '  
         + cast(@idvalue as nvarchar(max)) 
from 
    @tmp_Accounts 
where 
    PKCOLUMN_NAME = @colName

另请注意,您需要根据所选的 id 调整数据类型。

例如

SQLFiddle - 获取要执行的查询: http://sqlfiddle.com/#!3/fbf40/1

SQLFiddle - 执行返回的查询: http://sqlfiddle.com/#!3/fbf40/2

【讨论】:

  • 谢谢!我试了一下,看起来不错!我将在 C# 中实现它并对其进行测试,然后如果它正常工作,我将提供反馈:)
  • 您需要添加很多内容以使其健壮 - 例如如果 id 列与外键中使用的列不同,它会更好。对于不直接引用特定表的多对多关系等,这也无济于事,因为您需要做一些通过链接表递归的更有趣的事情。
  • @probird 你 7 年前承诺的反馈在哪里?
猜你喜欢
  • 2018-04-12
  • 2016-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
相关资源
最近更新 更多