나는 테이블라는 MyProducts을하고 난에서 (항목 1 돌아가려면 나는 그것이 내가 전달 문자열 배열에 필터링하려는 그러나SQL 서버 SELECT 문 필터
SELECT item1, item2 from MyProducts
을 ITEM2 기음#). 이것은 매우 큰 테이블입니다. 그래서 나는 'IN'문장이 빠져 있습니다. join 문을 사용하면 어떻게 될까요? 감사!
나는 테이블라는 MyProducts을하고 난에서 (항목 1 돌아가려면 나는 그것이 내가 전달 문자열 배열에 필터링하려는 그러나SQL 서버 SELECT 문 필터
SELECT item1, item2 from MyProducts
을 ITEM2 기음#). 이것은 매우 큰 테이블입니다. 그래서 나는 'IN'문장이 빠져 있습니다. join 문을 사용하면 어떻게 될까요? 감사!
IN
문이 "out"인 이유는 없습니다. 궁극적으로, 그것은 필터링의 완벽하게 합리적인 방법입니다 - 옵티 마이저가 다양한 옵션을 걱정하게하십시오. MyProducts
이 큰 것은 분명 영향을받지 않습니다. 그러나 조인을 추가하면 더 많은 작업이 이루어 지지만 "히트"또는 관련 작업의 수를 줄일 수는 없습니다. 날씬한 단지입니다 함께 예를 들어,이를 위해 :
string[] filter = ...
var rows = connection.Query(
"select item1, item2 from MyProducts where SomeField in @filter",
new {filter});
또는 LINQ로를 : 난 항상이 방법을 좋아
string[] filter = ...
var rows = db.Products.Where(x => filter.Contains(x.SomeField));
OP에는 MyProducts 또는 필터 배열의 크기가 문제가되는지 언급되지 않았습니다. 필터 배열에 2000 개가 넘는 항목이있을 경우 (SQL) 질식 할 것입니다. 그렇지 않으면 대부분의 경우 Contains가 좋은 해결책입니다. –
@Jim 단일 선택을 위해 서버로 2000 필터 옵션을 가져와야하는 경우 이미 문제가 있습니다. 대역폭만으로는 불만을 갖습니다. 그렇다면 디자인 문제와 같은 소리가납니다. –
한 가지 해결 방법은 임시 테이블을 만들고 그 테이블에 조인하는 것입니다. 임시 테이블에는 조인 할 컬럼에 대한 인덱스가있을 수 있습니다.
어떻게 그럴 수 있습니까? 배열을 처리하는 방법을 정확히 모르는 경우 – Badmiral
...
CREATE FUNCTION dbo.Split(@String varchar(max), @Delimiter char(1))
returns @temptable TABLE (Value varchar(max))
as
begin
declare @idx int
declare @slice varchar(max)
select @idx = 1
if len(@String)<1 or @String is null return
while @idx!= 0
begin
set @idx = charindex(@Delimiter,@String)
if @idx!=0
set @slice = left(@String,@idx - 1)
else
set @slice = @String
if(len(@slice)>0)
insert into @temptable(Items) values(@slice)
set @String = right(@String,len(@String) - @idx)
if len(@String) = 0 break
end
return
end
는 당신은이 작업을 수행 할 수 있습니다. ..
참고 : Th 많은 스플릿 함수가 있으므로이 특정 함수를 사용할 필요가 없습니다.
이 같은 테이블 매개 변수를 사용하는 SQL Server 2008을 사용할 때 사용한 또 다른 방법 ...
CREATE TYPE [dbo].[LookupTable] As Table
(
ID Int primary key
)
CREATE PROCEDURE [dbo].[SampleProcedure]
(
@idTable As [dbo].[LookupTable] Readonly
)
AS
BEGIN
SELECT <columns>
FROM <mytable> mt
INNER JOIN @idTable s ON s.Id= my.Key
END
이 방법으로 C#을에서 SQL 서버에 매개 변수를 전달 ...
DataTable dataTable = new DataTable("SampleDataType");
dataTable.Columns.Add("Id", typeof(Int32));
foreach (var id in <mycollectionofids>)
dataTable.Rows.Add(id);
SqlParameter parameter = new SqlParameter();
parameter.ParameterName="@Id";
parameter.SqlDbType = System.Data.SqlDbType.Structured;
parameter.Value = dataTable;
command.Parameters.Add(parameter);
어떤 버전의 sql-server? 2008 이상일 경우 테이블 반환 매개 변수를 사용할 수 있습니다 – Steve
필터링중인 열이 어떤 방식 으로든 색인이 생성됩니까 (그렇다면 색인의 종류)? 색인/유형을 보류중인 다른 검색 옵션을 사용할 수 있습니다. – newfurniturey
필터링 대상 열은 인덱싱되지 않으며 고객 이름 인 varchars입니다. 그리고 네, 그것은 SQL 서버 2008 – Badmiral