基于表内容的SQL连接

基于表内容的SQL连接,sql,sql-server,Sql,Sql Server,我有一个表,其中包含与另一个表和包含答案的字段相对应的引用的问题。比如: 我想查询questions表并返回QID、QuestionText以及每个QID的[ResponseTable].[ResponseField]中包含的值。当时的设计很灵活。然而,应用程序开发人员希望有一个存储过程,而SQL开发人员则指望有一个应用程序内解决方案来解决这个问题 我试图建立这个查询已经到了极限。你建议如何完成这项任务 听起来应该考虑重新设计(例如,将所有响应存储在一个表中),但如果不可能,则可以使用。然而,

我有一个表,其中包含与另一个表和包含答案的字段相对应的引用的问题。比如:

我想查询questions表并返回QID、QuestionText以及每个QID的[ResponseTable].[ResponseField]中包含的值。当时的设计很灵活。然而,应用程序开发人员希望有一个存储过程,而SQL开发人员则指望有一个应用程序内解决方案来解决这个问题


我试图建立这个查询已经到了极限。你建议如何完成这项任务

听起来应该考虑重新设计(例如,将所有响应存储在一个表中),但如果不可能,则可以使用。然而,使用它可能是危险的,因为它容易受到伤害。可以采取一些预防措施,例如在表名和列名上使用。在使用动态SQL之前,这也是一个很好的阅读方法:


听起来应该考虑重新设计(例如,将所有响应存储在一个表中),但如果不可能,则可以使用。然而,使用它可能是危险的,因为它容易受到伤害。可以采取一些预防措施,例如在表名和列名上使用。在使用动态SQL之前,这也是一个很好的阅读方法:


我不认为你会喜欢听这个答案,因为它可能意味着一些重大的返工,但我认为这是正确的答案。去掉问题表,将问题放入Client1、Client9和Jobs表中的新问题字段中;每个响应一个

例如,Client1表将包含以下字段:

ColorPref
ColorPrefQuestion
Rating
RatingQuestion
……等等


围绕该设计工作是可以管理的,而围绕您现在的设计工作将是一件令人头痛的事情。

我认为您不会喜欢听到这个答案,因为它可能意味着一些重大的返工,但我认为这是正确的答案。去掉问题表,将问题放入Client1、Client9和Jobs表中的新问题字段中;每个响应一个

例如,Client1表将包含以下字段:

ColorPref
ColorPrefQuestion
Rating
RatingQuestion
……等等


围绕设计的工作将是可管理的,在围绕设计的工作中,你现在会头疼。

直到你提到重写,考虑使用视图将这些响应表组合在一起的想法。

CREATE VIEW ClientResponses AS
    SELECT QID, ResponseField FROM [Client1]
    UNION
    SELECT QID, ResponseField FROM [Jobs]
    UNION
    SELECT QID, ResponseField FROM [Client9]
    -- ..... add the new tables as they are created
这将

  • 避免使用动态SQL
  • 为您提供一个维护查询的位置
  • 提供一种非常简单、可读的方法来将这些内容组合在一起

  • <> P>直到您提到重写,考虑使用视图将这些响应表组合在一起的想法。

    CREATE VIEW ClientResponses AS
        SELECT QID, ResponseField FROM [Client1]
        UNION
        SELECT QID, ResponseField FROM [Jobs]
        UNION
        SELECT QID, ResponseField FROM [Client9]
        -- ..... add the new tables as they are created
    
    这将

  • 避免使用动态SQL
  • 为您提供一个维护查询的位置
  • 提供一种非常简单、可读的方法来将这些内容组合在一起

  • 那么,您是说对响应表的查询会根据问题的不同而有所不同?你想知道在哪一张表中查找的参考资料是什么?我的第一个想法是应该对设计进行审查。所示的表格是包含近100个问题的主问题表。有20多个可能出现响应数据的表位置(ResponseTable)和另外20多个可能出现的字段(ResponseField)。最初的设计人员认为,通过引用数据所在的位置来管理一组问题,并动态呈现问答数据会更容易。您可能需要使用动态SQL来实现这一点,但这会带来一些重大的安全隐患。所有响应字段的类型是否相同?如果不是,则不能为字段的某些值返回与其他值不同类型的查询。在输出中,它们必须全部转换为同一类型。那么,您是说响应表的查询将根据问题的不同而有所不同?你想知道在哪一张表中查找的参考资料是什么?我的第一个想法是应该对设计进行审查。所示的表格是包含近100个问题的主问题表。有20多个可能出现响应数据的表位置(ResponseTable)和另外20多个可能出现的字段(ResponseField)。最初的设计人员认为,通过引用数据所在的位置来管理一组问题,并动态呈现问答数据会更容易。您可能需要使用动态SQL来实现这一点,但这会带来一些重大的安全隐患。所有响应字段的类型是否相同?如果不是,则不能为字段的某些值返回与其他值不同类型的查询。它们必须全部转换为输出中的相同类型。感谢您的回复,我已经考虑了动态SQL路由,甚至今天早些时候看过了参考文章。这段代码是否还需要预先知道列名和表名。我认为这种方法背后的理论最初是基于主表获取给定问题集的所有问题和答案。我对重新设计持开放态度,但考虑到反应的分散性,我不知道还有什么好的选择。数据存在的位置是如此根深蒂固,以至于该部分可能永远不会更改。SQL注入可能不是问题,因为查询没有使用任何外部提供的输入,只是表中已有的数据。@Quark否,数据不必预先知道。这只是一个例子。
    @tableName
    @columnName
    的值可以来自任何地方。在您的情况下,我假设您会根据QID从问题表中选择它们。@TMN正确,但始终值得一提。而且,如果
    ResponseField
    可以通过用户输入来填充,那么SQL注入是可以想象的。感谢您的响应,我已经考虑了动态SQL路由,甚至看过了toda前面的参考文章