分割機能を使用してクエリに値の範囲を追加しようとしています。私はまた、値を一緒に 'OR'したいが、最初のものを最初にする。私は分割関数を使用するはるかに大きなクエリで見つかった例に従っているので、小さなクエリを使ってその動作を理解しようとしました。これまでのところ、私が得られるのはエラーです。* "The name 'Select Country from sp WHERE(sp.CountryID in(SELECT [値] FROM dbo.Split(' 2,22、 '、'、 '))) 'は有効な識別子ではありません。」* DynamicSQLを知っていて、この分割機能がどのように動作するはずです。DynamicSQL分割機能がコンマ区切り文字列の条件を追加できません。
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
、これはsplit関数のコードです:
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を使用している場合、コンマで区切られた文字列をコンマに変換するためにスプリッタを使用する必要はありません区切られた文字列。 –