2009-06-15 46 views
1

給定一對變量中的表名和列名,我可以在不使用動態sql的情況下執行選擇查詢嗎?如何在列名和表名都傳入時運行查詢?

例如,我想要的東西更好比這

CREATE PROCEDURE spTest (@table NVARCHAR(30), @column NVARCHAR(30)) AS 

    DECLARE @sql NVARCHAR(2000) 
    SELECT @sql = N'SELECT ' + @column + N' FROM ' + @table 
    PRINT @sql 

    EXEC sp_executesql @sql 

我想這樣做,因爲我的動態SQL版本比非動態版3X慢(這沒有按」 t支持一個可編程的表/列名,因此這個問題)。

+0

初步共識似乎是我想要的不能完成。儘管感謝您的期待!我希望可能有一些基於創意的解決方案(可能使用視圖)或一些性能竅門,我應該考慮... – 2009-06-15 21:24:09

+0

根據這篇文章(http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/changing- exec-to-sp_executesql-doesn-tp),正確使用sp_executesql可以通過參數化來改進動態查詢。 – 2009-06-17 17:23:00

回答

2

動態版本會慢3倍,僅僅是因爲你將要交換表名,並且解析器無法爲此優化。

您可能希望在例程中使用嵌套的switch排序語句,並使用它從預定義的表/列中選擇SELECT語句,特別是如果您的模式不會經常更改。這應該快得多,但是你會失去真正的動力。

1

所以這聽起來像是你是否可以在不使用動態SQL的情況下在運行時構建和運行查詢?

我會說答案是否定的。選項包括:

  • 動態SQL - 調用sp_ExecuteSQLExec()給用戶自建的字符串。無論是使用ADO庫和Command對象的傳遞SQL,還是正好在sproc中。
  • 編譯的SQL - 使用通常的對象(sprocs和UDF)以及與已知良好對象交互的已知良好語句。在這種情況下,事先完成解析。
相關問題