2011-08-11 2 views
10

어제 사용자 그룹 모임에 있었는데 매개 변수화 된 쿼리를 사용하는 것이 쿼리를 harcoding하는 것보다 낫다고 지적했습니다. 반대로이 두 쿼리 간의 모범 사례

DECLARE @Client1 UNIQUEIDENTIFIER, 
@Client2 UNIQUEIDENTIFIER 
SET @ClientId1 ='41234532-2342-3456-3456-123434543212'; 
SET @ClientId2 = '12323454-3432-3234-5334-265456787654'; 

SELECT ClientName 
FROM dbo.tblclient 
WHERE id IN (@Client1,@Client2) 

: 즉,이 (이 생각보다 훨씬 더 큰 규모로 명백하게) 도움이 아무것도하지 않는, 생각에 저를 얻었다 그것은 상처를 안

SELECT ClientName 
FROM dbo.tblclient 
WHERE id IN ('41234532-2342-3456-3456-123434543212','12323454-3432-3234-5334-265456787654') 
+2

질문의 첫 번째 문장에서 이 더 좋은 의미 인을 명확히 할 수 있습니까? 나는 [엄마의 착취] (http://xkcd.com/327/)에 익숙하지만 다른 주장에 대해 다소 의심 스럽다. –

답변

4

IN 목록이 때때로 변경되면 매개 변수가있는 쿼리와 IN 절이 실제로 구현되지 않습니다. Parameterize an SQL IN clause

이 매개 변수, 설계, 단지 하나 개의 값은 다음과 같습니다

이 SO 질문을 읽어보십시오. SQL Injection과 같은 보안 문제를 염두에두고 수동으로 구현해야합니다.

성능 관점에서 볼 때, 특히 동일한 쿼리가 반복적으로 실행되지만 매개 변수 값이 다른 경우 매개 변수가있는 쿼리의 성능이 향상됩니다. 그러나 동적 인 IN 목록 (때로는 2 개, 때로는 3 개)이 있으면 매개 변수화 된 쿼리를 사용하는 이점을 얻을 수 없습니다.

희망을 잃지 마십시오. 어떤 사람들은 그것을 구현할 수있었습니다 (매개 변수화 된 쿼리 및 IN 절). 그것은, 다시, 사소한 것은 아니지만.

1

있지만 ' 사용자 입력에 의해 생성 된 쿼리를 사용할 때 준비된 문에서 가장 큰 효과를 얻으려고합니다. 버튼을 클릭하여 '모두 표시'하면 크게 문제가되지 않습니다. 그러나 사용자가 이름을 입력하라는 메시지를 표시하는 경우 입력/업데이트/선택/등 전에 입력을 매개 변수화해야합니다.

예를 들어, "Mike DROP TABLE MASTER"로 이름을 입력 한 경우; 또는 DB에 큰 테이블 이름이 무엇이든, 그것은 당신을 위해 정말 추악해질 수 있습니다. 미안한 것보다 안전한거야, 맞지?

EDIT : OP가 여기에 댓글을 달고 질문을했습니다. 코드 예제로 업데이트되었습니다.

public int myNum; 
SqlParameter spNum=new SqlParameter("@myNum", SqlDbType.Int); 
//you can also check for null here (but not really relevant in this case) 
command.Parameters.Add(spNum); 
string sql="INSERT INTO Table(myNum)"; 
sql+=" VALUES(@myNum)"; 
command.CommandText = sql; 
int resultsCt = command.ExecuteNonQuery(); 

데이터베이스에서 작업하기 전에 코드가 입력을 정수로 강제하는 방법을 확인하십시오. 그런 식으로 누군가가 속임수를 시도하면 DB에 해를 끼치기 전에 거절 당한다.

+0

그는 SQL 인젝션 위험보다 성능 측면에서 요구하고 있다고 생각합니다. – JNK

+0

아. 그렇다면 제거하겠습니다. 해명 해줘서 고마워. – rownage

+0

솔직히 OP까지. 내가 질문에서 얻은 것. – JNK

1

데이터베이스가 많고 조인이 많은 복잡한 쿼리에서 데이터베이스는 실행 계획을 수립하는 데 시간을 사용할 수 있습니다. 매개 변수화 된 쿼리를 사용할 때 실행 계획은 다른 매개 변수를 사용하여 쿼리를 여러 번 호출 할 때 데이터베이스 캐시에 유지됩니다.