2011-06-03 154 views
1

我需要幫助的查詢。在我的查詢中,我想通過我的表名作爲參數。這是我的查詢:需要幫助與sql查詢

SELECT DISTINCT 
    CONVERT (varchar, InspectDateTime) AS 'Inspect Date Time', 
    CONVERT (varchar, SynDateTime) AS 'Sync Date Time', 
    Employee, 
    ROUND(OverAllPercentage, 2) AS Grade 
FROM 
    Table_Name 
WHERE 
    (DATEADD(dd, DATEDIFF(dd, 0, InspectDateTime), 0) 
    BETWEEN 
     DATEADD(dd, DATEDIFF(dd, 0, @From), 0) AND 
     DATEADD(dd, DATEDIFF(dd, 0, @To), 0)) 
ORDER BY 
    'Inspect Date Time' 

在這裏,我想通過Table_Name作爲參數。請注意,這個查詢已經以兩個aurguments作爲參數,即"@From「和」 @To

問候 阿卜杜拉

+3

你正在使用哪個數據庫? (動態sql的生成不同於db到db) – davek 2011-06-03 06:46:12

+0

請注意,您的order by子句將按字母順序排序日期。這是你的意圖嗎? – 2011-06-03 07:21:21

回答

3

如果您正在使用MS SQL工作,你可以這樣做:

CREATE PROCEDURE sp_GetMyStuff 
(
    @From datetime, 
    @To datetime, 
    @TableName nvarchar(100) 
) 
AS 

exec('  
    SELECT DISTINCT 
     CONVERT (varchar, InspectDateTime) AS ''Inspect Date Time'', 
     CONVERT (varchar, SynDateTime) AS ''Sync Date Time'', 
     Employee, 
     ROUND(OverAllPercentage, 2) AS Grade 
    FROM 
     ' + @TableName + ' 
    WHERE 
     (DATEADD(dd, DATEDIFF(dd, 0, InspectDateTime), 0) 
     BETWEEN 
      DATEADD(dd, DATEDIFF(dd, 0, ' + @From + '), 0) AND 
      DATEADD(dd, DATEDIFF(dd, 0, ' + @To + '), 0)) 
    ORDER BY 
     1 
'); 

,然後叫它

sp_GetMyStuff '2011-05-05', '2011-06-05', 'TBL_MYTABLE' 
+0

我不記得我的頭頂。你可以使用+ concat字符與日期時間和varchar?我會猜不到,但我從記憶中不能確定。 – RThomas 2011-06-03 07:01:27

+0

它就像一個魅力!我們在說話時使用這個。 – balexandre 2011-06-03 07:25:19

+0

嗨Balexandre,謝謝你的帖子。在將@From和@To轉換爲varchar後,它工作得很好。 – Abdullah 2011-06-05 11:12:25

3

在SQL Server中,如果你想‘參數多態’的表名,您必須使用動態SQL

如果是這樣,你必須閱讀厄蘭的The Curse and Blessing of dynamic SQL作爲一個前奏。

因此,基本上,你需要建立你的SQL語句作爲字符串,然後執行它。該re是沒有其他方式在SQL Server T-SQL語句中「參數化」表名。

+0

+1鏈接!有書籤 – davek 2011-06-03 06:53:24

+0

感謝馬克您的評論:) – Abdullah 2011-06-05 11:23:15

3

OK,假設你使用SQL Server(由DATEADDDATEDIFF功能判斷),你需要

  1. 構建串聯SQL命令 作爲字符串(注意不要讓 SQL注入:也就是說,你應該通過查找 可能的名字形成 information_schema和驗證 等檢查 您table_name變量是 有效的表名)

  2. 執行使用 sp_executesql您的動態SQL:http://msdn.microsoft.com/en-us/library/ms188001.aspx

+0

+1這個答案鏈接到sp_executesql。由於海報不僅要查詢動態表,還要傳遞日期參數以及sp_executesql是唯一的方法。該鏈接解釋瞭如何將@From和@To傳入動態語句。 – RThomas 2011-06-03 06:55:44

+0

謝謝davek您的評論:) – Abdullah 2011-06-05 11:23:41

0

謝謝balexandre。小修改(鑄造@ From,@ To into varchar)後的最終查詢是:

CREATE PROCEDURE sp_GetMyStuff 

@TableName VARCHAR(128), 
@From DATETIME, 
@To DATETIME 

AS 

DECLARE @sql VARCHAR(4000) 
SELECT @sql = 'SELECT DISTINCT CONVERT (varchar, InspectDateTime) AS ''Inspect Date Time'', CONVERT (varchar, SynDateTime) AS ''Sync Date Time'', Employee, ROUND(OverAllPercentage, 2) AS Grade 
FROM ' + @TableName + ' 
WHERE 
(DATEADD(dd, DATEDIFF(dd, 0, InspectDateTime), 0) BETWEEN DATEADD(dd, DATEDIFF(dd, 0,'''+ CAST(@From AS VARCHAR(100)) +'''), 0) 
AND DATEADD(dd, DATEDIFF(dd, 0,'''+ CAST(@To AS VARCHAR(100)) +'''), 0)) 
ORDER BY ''Inspect Date Time''' 
EXEC (@sql) 

GO 
+0

如果您發佈代碼,XML或數據樣本,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」)以精確地設置格式並使其語法突出顯示! – 2011-06-05 11:24:10