2011-10-25 3 views
1

테이블의 레코드를 확인하는 여러 가지 쿼리가 있는데 이러한 레코드가없는 경우 쿼리가 추가됩니다. 이 과정에 관여하는 두 쿼리가 있습니다 : 어떤 식별자가없는 경우 내가 원하는대로 내가 ID로 아무것도 (또는 레코드를 업데이트 할 수 없습니다 해당하는 모든 IDS)가있는 경우SQL CE 매개 변수 전달

1) select id from table where <conditions>

, 나는 두 번째 쿼리를 실행 :

2) 물론 <conditions>insert into table(<columns>) values(<values>)

, <columns><values>는 자신의 상황에 대한 올바른 문자열입니다. 내가 원하는 것은 하나에이 두 쿼리를 결합하는 것입니다

insert into table(<values>) select <parameter list> where not exists(select id from table where <conditions>)

그래서 대신이 쿼리의 2 예제의 참여 하나 개의 쿼리가있을 것입니다 :

insert into persons(name) select @Name where not exists (select id from persons where name = @Name)

문제는 내가 쿼리에 대한 매개 변수를 사용하고이 복합 쿼리를 실행할 때 "이 위치에 매개 변수가 허용되지 않습니다."라는 문자가 올바른 위치에 있거나 매개 변수가 유효한 지 확인하십시오. 이 모든 것 SQL 문을. " 매개 변수를 무시하고이 쿼리에 대한 예외가 발생하지 않는 방법이 있습니까? C# 및 SqlCe 관련 클래스를 사용하고 있습니다.

답변

0

쿼리를 합성으로 병합하면 어떤 이점이 있습니까? 쿼리가 지원되는 경우 (사실 SQL Compact 쿼리 파서가이를 지원하는지 의심 스럽습니다.) SQL 엔진은 본질적으로 어쨌든 두 쿼리를 본질적으로 수행해야합니다. 나는 두 개의 분리 된 질의를 더 쉽게 읽을 수있다.

별도의 쿼리로, TableDirect를 사용하여 어쨌든 복합 쿼리보다 훨씬 빠른 속도로 만들 수 있습니다. this question에 대한 답을보고 앱에서 벤치마킹하세요. 쿼리 구문 분석기를 모두 소홀히하기 때문에 기존 쿼리 쌍보다 10 배 더 빠릅니다.

+0

이러한 쿼리는 수십 또는 수백 가지가 있습니다. 코드를 작성하면 최소한 코드를 줄일 수 있습니다. 그리고 나는 분명히 TableDirect를 시도해 볼 것입니다. 전에 사용하지 않았습니다. – Blablablaster

+0

저는 LOC를 줄이기위한 열렬한 팬 이었지만 짧지 만 읽기 어려운 코드는 반드시 승리하지 않았습니다. 그리고 TableDirect를 조심하십시오. 일단 그것을 사용하면 다른 SQL 쿼리를 다시 쓰고 싶지 않을 수 있습니다. – ctacke