EDIT:許可複数文字の区切り
は、これは私がそれを解決する方法です。それが含む:
- テーブル行にsplitingの改行のためのテーブル値関数(
xftSplit
)(CHAR(10))
- 行のn番目のフィールドを抽出するためのスカラー関数(
fSubstrNth
)セパレータ所与
- 負の値を受け入れるようにセパレータ
- (オプション)代替
Right
関数のn番目のインデックスを見つけるためのスカラー関数(fPatIndexMulti
)
- 最後に、いくつかの特定のコードは、ソリューションで使用する、以来SQLはコードスニペットのための動的テーブル・ファンクションの定義(つまり、あなたがいない
SELECT
動的な列を持つ関数から缶)今
、LLOW:
xftSplit
-- =============================================
-- Author: Bernardo A. Dal Corno
-- Create date: 15/07/2014
-- Description: Quebra valores a partir de caracteres e retorna lista em tabela
-- =============================================
CREATE FUNCTION [dbo].[xftSplit]
(
@Texto varchar(max),
@Splitter varchar(3)
)
RETURNS
@Lista TABLE
(
ValoresQuebrados varchar(8000)
)
AS
BEGIN
DECLARE @Pos Smallint
While len(@Texto)>0 BEGIN
SET @Pos = Patindex('%'[email protected]+'%',@Texto)
IF @Pos > 0 BEGIN
INSERT INTO @Lista
SELECT left(@Texto, @Pos-1)
SET @Texto = right(@Texto, len(@Texto)[email protected])
END
ELSE BEGIN
INSERT INTO @Lista
SELECT @Texto
SET @Texto = ''
END
End
RETURN
END
fSubstrNth
-- =============================================
-- Author: Bernardo A. Dal Corno
-- Create date: 18/07/2017
-- Description: substring com 2 PatIndex limitando inicio e fim
-- =============================================
CREATE FUNCTION fSubstrNth
(
@Text varchar(max),
@Sep varchar(3),
@N int --Nth campo
)
RETURNS varchar(max)
AS
BEGIN
DECLARE @Result varchar(max)
IF @N<1 RETURN ''
IF @N=1
SET @Result = substring(@Text, 1, dbo.fPatIndexMulti(@Sep,@Text,1)-1)
ELSE
SET @Result = substring(@Text, dbo.fPatIndexMulti(@Sep,@Text,@N-1)+LEN(@Sep), CASE WHEN dbo.fPatIndexMulti(@Sep,@Text,@N)>0 THEN dbo.fPatIndexMulti(@Sep,@Text,@N)-dbo.fPatIndexMulti(@Sep,@Text,@N-1)-LEN(@Sep) ELSE LEN(@Text)+1 END)
RETURN @Result
END
fPatIndexMulti
-- =============================================
-- Author: Bernardo A. Dal Corno
-- Create date: 17/07/2017
-- Description: recursive patIndex
-- =============================================
CREATE FUNCTION [dbo].[fPatIndexMulti]
(
@Find varchar(max),
@In varchar(max),
@N tinyint
)
RETURNS int
AS
BEGIN
DECLARE @lenFind int, @Result int, @Texto varchar(max), @index int
DECLARE @i tinyint=1
SET @lenFind = LEN(@Find)-1
SET @Result = 0
SET @Texto = @In
WHILE (@i <= @N) BEGIN
SET @index = patindex('%'[email protected]+'%',@Texto)
IF @index = 0 RETURN 0
SET @Result = @Result + @index
SET @Texto = dbo.xRight(@Texto, (@index + @lenFind)*-1)
SET @i = @i + 1
END
SET @Result = @Result + @lenFind*(@i-2)
RETURN @Result
END
xRight
-- =============================================
-- Author: Bernardo A. Dal Corno
-- Create date: 06/01/2015
-- Description: Right inverso (para nros < 0)
-- =============================================
CREATE FUNCTION [dbo].[xRight]
(
@Texto varchar(8000),
@Qntd int
)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @Result varchar(8000)
IF (Len(@Texto) = 0) OR (@Qntd = 0)
SET @Result = ''
ELSE IF (@Qntd > 0)
SET @Result = Right(@Texto, @Qntd)
ELSE IF (@Qntd < 0)
SET @Result = Right(@Texto, Len(@Texto) + @Qntd)
RETURN @Result
END
特定コード
SELECT
acolumn = 'any value',
field1 = dbo.fSubstrNth(line,',',1),
field2 = dbo.fSubstrNth(line,',',2),
anothercolumn = 'set your query as you would normally do',
field3 = (CASE dbo.fSubstrNth(line,',',3) WHEN 'C' THEN 1 ELSE 0 END)
FROM (
SELECT line = ValoresQuebrados FROM dbo.xftSplit(@StringVariable, char(10))
) lines
なお:
fSubstrNth
がラインから
xftSplit
を抽出するために、n番目のフィールドは、あなたが(どんなソース)からバルクにしたい文字列を含む変数を受け取り、受け取ってchar(10)
\n
のスプリッタとして、それは可能性がありその他
- クエリは他のものと同じにすることができます。これは、プロシージャ、テーブル機能、ビューなどに格納できることを意味します。
- ストアドプロシージャで使用する場合、動的列を含む文字列をロードするクエリと一時テーブルを作成する一般的な方法を作成することができますが、データを使用するには別のプロシージャを呼び出す必要があります。または、同じ手順で上記のような特定の問合せを作成する必要があります(非汎用で、再利用可能にする)