분할 함수를 사용하여 쿼리에 값의 범위를 추가하려고합니다. 나는 또한 'OR'값을 함께하지만 첫 번째 일을 먼저하고 싶습니다. 분할 함수를 사용하는 훨씬 더 큰 쿼리에서 찾은 예제를 따르면서 어떻게 작동하는지 알아 내려고 작은 쿼리를 만들었습니다. 지금까지 내가 얻은 것은 오류 * "국가 이름 * Select * from sp as WHERE (sp.CountryID in (SELECT [값] FROM dbo.Split ('2,22,', ','))))입니다. '은 유효한 식별자가 아닙니다. * DynamicSQL을 알고 있었고이 분할 함수가 어떻게 작동하는지 잘 모르겠습니다. 동적 SQL 쉼표로 구분 된 문자열에서 조건을 추가하는 Split 함수가 작동하지 않습니다.
DECLARE @Countries varchar(MAX);
DECLARE @FiltersOn bit;
DECLARE @Country int;
DECLARE @Query varchar(MAX);
Set @FiltersOn = 0;
Set @Query = 'Select * from Country As sp ';
Set @Countries ='2,22,'
IF (@Countries IS NOT NULL)
BEGIN
IF (@FiltersOn = 1)
BEGIN
SET @Query = @Query + ' AND '
END
ELSE
BEGIN
SET @Query = @Query + ' WHERE '
SET @FiltersOn = 1
END
SET @Query = @Query
+ '(sp.CountryID in (SELECT [Value] FROM dbo.Split('''
+ @Countries + ''', '','')))'
END
EXEC @Query
이
은 국가 테이블의 정의입니다 :CREATE TABLE [dbo].[Country](
[CountryID] [int] IDENTITY(1,1) NOT NULL,
[AgentID] [int] NULL,
[Name] [varchar](50) NULL,
[CountryLookupID] [int] NOT NULL
이것은 분할 기능 코드입니다 : 당신은 제대로 EXEC
문을 작성하지 않는
CREATE FUNCTION [dbo].[Split]
(
@String varchar(8000),
@Delimiter varchar(10)
)
RETURNS @ValueTable table ([Value] varchar(255))
BEGIN
DECLARE @NextString varchar(4000)
DECLARE @Pos int
DECLARE @NextPos int
DECLARE @DelimiterCheck varchar(1)
-- initialise
SET @NextString = ''
SET @DelimiterCheck = RIGHT(@String, 1)
-- add trailing delimiter
IF (@DelimiterCheck <> @Delimiter)
SET @String = @String + @Delimiter
-- find position of first delimiter
SET @Pos = CHARINDEX(@Delimiter, @String)
SET @NextPos = 1
-- loop while there is a delimiter in the string
WHILE (@Pos <> 0)
BEGIN
SET @NextString = SUBSTRING(@String, 1, @Pos - 1)
INSERT INTO @ValueTable ([Value]) VALUES (@NextString)
SET @String = SUBSTRING(@String, @Pos + 1, LEN(@String))
SET @NextPos = @Pos
SET @Pos = CHARINDEX(@Delimiter, @String)
END
RETURN
END
나는 휴지통에 그 스플리터를 던지기 건의 할 것입니다. 문자열을 분할하는 루프는 성능면에서 끔찍합니다. 나의 개인적인 마음에 드는 것은 이것이다. http://www.sqlservercentral.com/articles/Tally+Table/72993/ 몇 가지 다른 훌륭한 선택 사항을 여기에서 찾을 수 있습니다. http://sqlperformance.com/2012/07/t-sql-queries/split-strings –
그리고 동적 SQL을 이미 사용하고 있다면 스플리터를 사용하여 쉼표로 구분 된 문자열을 쉼표로 되돌릴 필요가 없습니다. 구분 된 문자열. –