2011-09-09 135 views
2

我正在使用Vb2005命中SQL服務器。我有一個非常複雜的查詢,在服務器上查找結構相同的數據庫。我正在研究參數化FROM子句,但似乎無法做到這一點。這裏就是我試圖SQL查詢中的參數化表名

Dim sql As String = "SELECT * " & _ 
         "FROM [@DB].[dbo].[Trips] AS T " & _ 
         "WHERE T.DepartTime >= CONVERT(DATETIME, 'Sep 08, 2011', 120);" 

    Dim cmd As New System.Data.SqlClient.SqlCommand(sql, conn) 
    cmd.Parameters.Add("@DB", SqlDbType.Char) 
    cmd.Parameters("@DB").Value = "DriverDb" 

根據用戶需要,我會打「DriverDb」或「MaintDb」或'DispDb的數據庫。 SQL字符串實際上比在大約5個地方引用數據庫要複雜得多,所以想簡化它以便我可以用參數替換。

+0

連接字符串呢? –

+0

那是在控制之下。我爲每個用戶請求使用不同的連接字符串。 – sinDizzy

+1

我認爲評論的意思是「怎樣設置連接字符串中的初始目錄,例如初始目錄= DriverDb –

回答

2

我想我們不能這樣做的DB名稱或表名稱可能不被視爲參數。我的建議是使用變量「數據庫」,並將其附加到字符串「sql」,如下所示

Dim db As String = "DriverDb"; 
Dim sql As String = "SELECT * " & _ 
        "FROM ["& db &"].[dbo].[Trips] AS T " & _       
        "WHERE T.DepartTime >= CONVERT(DATETIME, 'Sep 08, 2011', 120);" 

希望這有助於!

+0

是的,這就是我現在所擁有的,但我只是試圖通過插入帶有參數的db名稱來使它更清潔。有一個小的查詢是可以的,但對於更復雜的查詢,不僅需要編碼,而且要稍後再修改它。 – sinDizzy

+0

最後我剛剛使用了一個正則表達式 – sinDizzy

1

以下問題的答案似乎總結得很好。 Dynamic SQL (passing table name as parameter)如果可能的話,你應該避免這樣的動態SQL。

+0

動態SQL可以簡單地通過一系列IF來避免。 +1)以避免動態SQL) –

+0

我打的數據庫無法控制,只是每個數據庫的結構都是相同的,而且它們保存着不同實體的數據,是否可以修改爲是一個ID與ID ...是的,但我無法控制該部分。但指出,我只是不想寫一個複雜的SQL,唯一的區別是數據庫名稱。 – sinDizzy