我有一个表,其中包含对包含答案的另一个表和字段的相应引用的问题。类似的东西:
我想查询问题表并返回QID,QuestionText以及每个QID的[ResponseTable]。[ResponseField]中包含的值。当时设计灵活多变。然而,应用程序开发人员期待一个存储过程,并且SQL开发人员正在依靠针对此问题的in app解决方案。
我正在试图构建此查询。你会如何建议完成这项任务?
答案 0 :(得分:0)
听起来应该考虑重新设计(例如,将所有回复存储在一个表中),但如果不可能,则可以使用https://github.com/DISTORTEC/distortos/tree/master/include/distortos。但是,使用它可能很危险,因为它容易受到dynamic SQL (using sp_executesql
)的攻击。可以采取一些预防措施,例如在表名和列名上使用SQL injection。在使用动态SQL之前,这也是一个很好的阅读:QUOTENAME
。
DECLARE @tableName NVARCHAR(50)
DECLARE @columnName NVARCHAR(50)
DECLARE @query NVARCHAR(MAX)
SET @tableName = 'Client1'
SET @columnName = 'ColorPref'
SET @query = 'SELECT ' + QUOTENAME(@columnName) + ' FROM ' + QUOTENAME(@tableName)
EXEC sp_executesql @query
答案 1 :(得分:0)
我认为你不会听到这个答案,因为它可能意味着一些重大的返工,但我认为这是正确的答案。摆脱问题表并将问题放入Client1,Client9和Jobs表中的新Question字段中;每个回复一个。
例如,Client1表将包含以下字段:
{{1}}
......等等
解决这个设计将是可以管理的,因为解决你现在的设计将会很头疼。
答案 2 :(得分:0)
在进行上述改写之前,请考虑使用视图将这些响应表组合在一起的想法。
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
这将