2011-09-09 4 views
2

SQL 서버에 Vb2005를 사용하고 있습니다. 나는 서버에서 똑같은 구조의 데이터베이스를 조회하는 매우 복잡한 쿼리를 가지고있다. 나는 FROM 절을 매개 변수화하는 것을 조사하고 있었지만 그것을 할 수는 없다. 여기에 내가 내가 'DriverDb'또는 'MaintDb'또는 'DispDb'데이터베이스를 공격 할 필요가있는 사용자에 따라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" 

을하려고했던 것입니다. SQL 문자열은 실제로 약 5 개 장소에서 db에 대한 참조가있는 것보다 훨씬 복잡하므로 단순화하여 매개 변수로 바꿀 수 있습니다.

+0

연결 문자열은 어떻게됩니까? –

+0

통제하에 있습니다. 사용자 요청마다 다른 연결 문자열을 사용합니다. – sinDizzy

+1

나는이 코멘트가 "초기 문자열을 연결 문자열로 설정하는 것은 어떨까요?"라고 생각합니다. 예 : 초기 카탈로그 = DriverDb –

답변

2

나는 매개 변수로 간주되지 않을 수있는 DB 이름이나 테이블 이름에 대해서는 그렇게 할 수 없다고 생각합니다. 내 제안은 변수 "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가있는 하나의 DB가 될 수 있습니다 ... 그렇지만 제어 할 수는 없습니다. 하지만 요점은, 난 그냥 복잡한 SQL을 쓰고 싶지 않았어 유일한 차이점은 db 이름입니다. – sinDizzy

관련 문제