2011-03-23 5 views
1

사용자 입력 텍스트 필드를 기반으로 데이터를 필터링해야하는 SQL Server에서 검색 쿼리를 실행해야합니다. 문제는이 쿼리를 여러 테이블에서 실행해야하므로 (런타임시 tablecolumns 만 알기 때문입니다). 필터와 같은 SQL 쿼리

내가 가지고있는 쿼리입니다 :
SELECT * FROM [BTcegeka.C2M].[dbo].[Lookup_Country] WHERE Name LIke '%test%' 

지금 문제는 내가 모든 열에서 같은 기능을 할 필요가있는 테이블에 (난 단지 런타임에 C 럼 이름을 알고있다). ASP.NET 웹 사이트에서이 쿼리를 호출합니다. 사용자는 드롭 다운 목록에서 표를 선택한 다음 검색 필드를 입력 할 수 있습니다.
SELECT * FROM [BTcegeka.C2M].[dbo].[Lookup_Country] WHERE * LIke '%test%' 

은 분명히 실패 '처럼 어디 *'

:

정말 달성 할 것입니다. 이것을 어떻게 할 수 있습니까?

+0

이 솔루션은 런타임에 열 이름을 변경하는 것입니다 - 선택한 테이블을 사용하고 필드를 검색 (그리고 이름이 유효하고 허용하는 경우 보안 확인). ** 편집 : ** 사용자가 검색 할 하나의 열을 선택하므로 모든 열의 표현식을 검색하면 결과가 잘못됩니다. – MacGucky

+0

왜 동적 SQL이나 연결된 쿼리 문자열을 사용할 수 없습니까? –

답변

0

이렇게 SQL 쿼리를 사용해보십시오. [BTcegeka.C2M] FROM

SELECT *. DBO]. Lookup_Country] COL1 LIKE '% 테스트 %' OR COL2 LIKE '% 테스트 %' OR COL3 같은 '% 테스트 %'

요구 사항이 필요하면 OR 대신 AND를 사용할 수 있습니다.

+1

이것은 가능한 한 큰 문제가 있습니다 : (a) 많은 칼럼에서와 마찬가지로 성능은 피할 수 있다면 (b) 사용자가 원하는 열을 하나 선택해야하므로 실제로 필요한 방식으로 작동하지 않습니다. 검색 (어떤 식 으로든 문제가있는 질문). – MacGucky

+0

LIKE로 열을 찾을 수없는 경우 실패합니다. –

+0

동의 문제로 성능 문제가 있으며 SQL 서버의 전체 텍스트 검색 기능으로 정렬 할 수 있습니다. – Shailesh

0

런타임에 열 이름을 알고 있으면 SQL에 전달하기 전에 .NET에서 쿼리를 작성해야합니다. 올바른 열 이름으로 빌드 할 수 있습니다. 이 방법을 사용하면 검색하는 열의 유형도 고려할 수 있습니다. 선택한이 경로는 SQL 주입이 발생하기 쉽기 때문에 SQL에 쿼리를 보내기 전에 확인해야합니다.

0

이 작업을 실제로 수행해야하는 경우 sqlserver 메타 테이블을 검색하고 선택한 사용자 테이블의 설명을 찾을 수 있습니다. 이 데이터의 좋은 사용을 쉽게 확인하고 당신은 당신이이 정보를 원하는 SQL을 만들 수 있지만 성능이되지 않을 수 있습니다 좋은 당신은 같은 테이블의 모든 열을 조회 할 수 있습니다

0

: 다음

select name from sys.columns where object_id = object_id('YourTable') 

각 열에 like을 수행하는 쿼리를 생성 할 수 있습니다.

또 다른 방법은 검색하려는 모든 문자열의 연결을 포함하는 SearchField이라는 계산 된 열을 만드는 것입니다. 그렇다면 다음과 같이 검색 할 수 있습니다.

create table #tmp (id int identity, col1 varchar(10), col2 varchar(10), 
    SearchField as col1 + '|' + col2 persisted) 
insert #tmp (col1, col2) values 
    ('alfa', 'beta'), 
    ('gamma', 'DELTA'), 
    ('GAMMA', 'delta') 

select * from #tmp where SearchField like '%alfa%' 
0

이것을 구현하려면 동적 SQL을 사용해야합니다. 열 이름을이 저장 프로 시저에 매개 변수로 전달해야하거나 저장 프로 시저를 만들지 않으려면 매개 변수 하나를 선언하고 드롭 다운 목록에서 선택한 값을 할당 한 다음 쿼리에서 사용하십시오.

create procedure sp_dynamicColumn 
    (
    @columnName varchar(10) 
) 
    as 
    begin 
    declare @DYNAMICSQL nvarchar(4000); 
    SET @DYNAMICSQL = 'Select * from [BTcegeka.C2M].[dbo].[Lookup_Country] where '+ @columnName + ' like ''%test%''' 
    EXECUTE SP_EXECUTESQL @DYNAMICSQL 
    end 
    go