2015-10-19 80 views
1

我有一個單獨的表格,其中包含問題以及對包含答案的另一個表格和字段的相應引用。喜歡的東西:基於表格內容的SQL JOIN

enter image description here

我想查詢的問題表並返回QID,QuestionText和包含在[ResponseTable]值[ResponseField]每個QID。當時的設計靈活多變。然而,應用程序開發人員期待着一個存儲過程,而SQL開發人員正指望一個針對此問題的應用程序解決方案。

我在試圖建立這個查詢的繩索的盡頭。你會如何建議完成這項任務?

+0

所以,你是說對響應表的查詢會根據問題而有所不同?你有什麼參考知道要查找哪個表格?我的第一個想法是應該審查設計。 – InbetweenWeekends

+0

顯示的表格是包含近100個問題的主問題表。有20多個潛在的表格位置(ResponseTable)可以顯示響應數據,另有20多個潛在字段(ResponseField)。原始設計師認爲,通過參考數據的存放位置和動態顯示問答數據來管理一組問題會更容易。 – Quark

+0

您可能必須使用動態SQL來完成此操作,但它有一些主要的安全隱患。 https://msdn.microsoft.com/en-us/library/ms188001.aspx – Dijkgraaf

回答

0

我不認爲你會喜歡聽到這個答案,因爲它可能意味着一些重大的返工,但我認爲這是正確的答案。擺脫問題表並將問題放入Client1,Client9和Jobs表中新的問題字段中;每個響應一個。

例如,客戶端1表有以下字段:

ColorPref 
ColorPrefQuestion 
Rating 
RatingQuestion 

...等等

周圍的設計工作圍繞你現在將是一個頭疼的設計工作會在哪裏管理。

+0

不幸的是,我不認爲這是可能的。對於給定的客戶表,可能存在無限的問題變化,因爲多個客戶使用相同的基礎表。我同意,如果此應用程序是從頭開始創建的,則您的方法將是理想的。我只是繼承了這份工作的混亂,並且努力保持它的功能性,直到下一次重大改寫。 – Quark

0

這聽起來像應該考慮重新設計(例如,將所有響應存儲在一張表中),但如果這不可行,則可以使用dynamic SQL (using sp_executesql)。但是,由於容易受到SQL injection的影響,因此使用可能會很危險。可以採取一些預防措施,例如在表名和列名上使用QUOTENAME。在使用動態SQL之前,這也是一個很好的閱讀:The Curse and Blessings of Dynamic SQL

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 
+0

感謝您的迴應,我已經考慮過動態SQL路線,甚至在今天早些時候查看了參考文章。這段代碼是否仍然需要知道columnName和tableName。我認爲這種方法背後的理論最初是基於主表獲取給定問題集的所有問題和答案。我很樂意進行重新設計,但考慮到答案的分散性,我不知道另一個好的選擇。數據的生命如此根深蒂固,以至於這部分可能永遠不會改變。 – Quark

+0

SQL注入可能不是問題,因爲查詢不使用任何外部提供的輸入,只是已經在表中的數據。 – TMN

+0

@Quark不,數據不需要預先知道。這只是一個例子。 '@ tableName'和'@ columnName'的值可以來自任何地方。在你的情況下,我假設你會從基於QID的問題表中選擇它們。 –

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 

這將

  1. 避免動態SQL
  2. 給你一個地方來維持查詢
  3. 提供一個非常簡單的,可讀的方式蹣跚了一起