2017-12-21 1 views
-1

데이터베이스 서버에서 실행될 때 끝낼 매개 변수화 된 SQL 문자열을 만들려고합니다.이 문자열은 실행될 때 원하는 결과를 반환합니다.C# 엔터티 프레임 워크에서 전체 텍스트 검색을위한 SQL 문자열 형식

SELECT * FROM OrderHeader WHERE FacilityId = 9 AND CONTAINS(*,'"Rich*"') 

아래의 세 가지 시도를 시도했지만 결과가 위의 목표 문과 같이 나오지 않을 수 있으며 그 결과는 첫 번째 문에 syntax error near '@p1'이고 두 번째 두 문에는 0이됩니다. .

시도 1

string sql = "SELECT * " + 
    "FROM OrderHeader " + 
    "WHERE FacilityId = @p0 AND CONTAINS(*,\"@p1*\")"; 

var orderByCustomerFullTextQuery = base.DbSet.SqlQuery(sql, intFacilityId, strSearchTerm).AsQueryable(); 

exec sp_executesql N'SELECT * FROM OrderHeader WHERE FacilityId = @p0 AND CONTAINS(*,"@p1*")',N'@p0 int,@p1 nvarchar(4)',@p0=9,@p1=N'Rich' 

시도 2 ​​

string sql = "SELECT * " + 
    "FROM OrderHeader " + 
    "WHERE FacilityId = @p0 AND CONTAINS(*,'\"@p1*\"')"; 

var orderByCustomerFullTextQuery = base.DbSet.SqlQuery(sql, intFacilityId, strSearchTerm).AsQueryable(); 

exec sp_executesql N'SELECT * FROM OrderHeader WHERE FacilityId = @p0 AND CONTAINS(*,''"@p1*"'')',N'@p0 int,@p1 nvarchar(4)',@p0=9,@p1=N'Rich' 

시도 3

string sql = "SELECT * " + 
    "FROM OrderHeader " + 
    "WHERE FacilityId = @p0 AND CONTAINS(*,\'\"@p1*\"\')"; 

var orderByCustomerFullTextQuery = base.DbSet.SqlQuery(sql, intFacilityId, strSearchTerm).AsQueryable(); 

exec sp_executesql N'SELECT * FROM OrderHeader WHERE FacilityId = @p0 AND CONTAINS(*,''"@p1*"'')',N'@p0 int,@p1 nvarchar(4)',@p0=9,@p1=N'Rich' 
+0

나는 그것은 당신이 쿼리를 실행하는 것과 동일을 주어야한다 귀하의 쿼리에서 *를 모두 제거해야하고이 매개 변수를 매개 변수에 추가해야한다고 생각하면 plz가 대답으로 게시 할 수 있는지 알려 주시기 바랍니다 – msoliman

+0

@msoliman 그래서 저는 여러분이 저의 질문에 찬성표를 던졌다 고 가정합니다. 너는 너의 대답을 지웠어? 그렇다면 냉기는 아닙니다. Joel은 먼저 실용적인 해결책을 찾았습니다. 따라서 그의 대답이 받아 들여졌습니다. 나는 네가 제대로 된 줄 알았지 만 너는 너무 늦었다. –

+0

나는 다른 대답이 당신에 의해 올바른 것으로 확인되었고 잘 작동 했으므로 방금 삭제했습니다. 그래서 내 이름도 계속 유지해야합니까? – msoliman

답변

2

이것을 시도 :

string sql = "SELECT * " + 
    "FROM OrderHeader " + 
    "WHERE FacilityId = @p0 AND CONTAINS(*,'\"' + @p1 + '*\"')"; 

다른 시도의 문제점은 문자열 리터럴의 일부로 sp_executesql 컨텍스트에서 평가 된 변수 @p1입니다. 쿼리의 요소가 아니 었습니다 ... 문자열 리터럴의 일부였습니다. 변수 @p1"@p1*" 값에서 분리 할 수 ​​있습니다.이 값을 앞에 오는 인용문의 리터럴 인 @p1과 후행하는 와일드 카드 및 따옴표의 리터럴로 분리하면됩니다.

SELECT * FROM OrderHeader WHERE FacilityId = 9 AND CONTAINS(*,'"' + 'Rich' + '*"') 

당신이 매개 변수에 할당으로, 당신은 또한 값을 조정 시도 할 수 있습니다 (정말 작동해야하지만)이 실패 :

string sql = "SELECT * " + 
    "FROM OrderHeader " + 
    "WHERE FacilityId = @p0 AND CONTAINS(*, @p1)"; 

...SqlQuery(sql, intFacilityId, "\"" + strSearchTerm + "*\"").AsQueryable(); 
+0

음, '+'근처에 잘못된 구문을 던지고 있습니다. –

+0

마지막 편집 내용이 내가 준 것과 동일한 대답으로 끝났지 만, @chad는 그와 작동하지 않는다고 말했습니다. – msoliman

+0

두 번째 버전이 작동했습니다! @P0 nvarchar (7) ', @ p0 = 9, @ p1 = N', @ p0 int, @ p0 int, @ p0 int, "리치 *" '. 고맙습니다! –

관련 문제