0

この例のように、列に違いの文字列がいくつか発生しています

'dsasdasdsd'+'ewewewew'+'45454545'+(avg('uuuuuuu'))

この文字列を複数の列に分割し、アフォスロープの間にある部分文字列を使用する必要があります

このような:

Column 1 = dsasdasdsd
Column 2 = ewewewew
Column 3 = 45454545
Column 4 = uuuuuuu

出現数はランダムであるため、元の列の長さも固定されていません (50 文字から > 1000 文字まで)。

4

4 に答える 4

2
DECLARE @InStr VarChar(1000) = '''dsasdasdsd''+''ewewewew''+''45454545''+(avg(''uuuuuuu''))'''
DECLARE @intStart INT = 0
DECLARE @intEnd INT = 1
DECLARE @ColNo INT = 1
DECLARE @MyString VARCHAR(2000)
DECLARE @SelectString VARCHAR(8000) = 'SELECT '



WHILE(@intStart < LEN(@InStr) )
BEGIN 
    SELECT @intStart = CHARINDEX(CHAR(39), @InStr, 0) + 1
    SELECT @intEnd = CHARINDEX(CHAR(39), @InStr, @intStart)  
    SELECT @SelectString = @SelectString + CHAR(39) + SUBSTRING(@InStr, @intStart, @intEnd - @intStart) + CHAR(39) + ' As [Column ' + CAST(@ColNo As Varchar) + '],'
    SELECT @InStr = SUBSTRING(@InStr, @intEnd + 1, LEN(@InStr)-@intEnd )

    SET @ColNo = @ColNo +1

END

SELECT @SelectString = LEFT(@SelectString, Len(@SelectString) -1)

EXEC (@SelectString)

私はこれで遊んでいますが、これは実行されますが、残念ながら今はそれを続ける時間がありませんが、これを改善できるでしょうか?

HTH

于 2012-10-02T09:19:54.790 に答える
2

これを試すことができます:

create table tSqlStrings (sText nvarchar(1000))

insert tSqlStrings values('''dsasdasdsd''+''ewewewew''+''45454545''+(avg(''uuuuuuu''))')

create table tResults (
  sColumn1 nvarchar(1000)
  ,sColumn2 nvarchar(1000)
  ,sColumn3 nvarchar(1000)
  ,sColumn4 nvarchar(1000)
)

DELETE tResults

DECLARE @sText nvarchar(1000) = (
  SELECT
    sText
  FROM
    tSqlStrings
)

DECLARE @lBegin int = CHARINDEX('''',@sText)
DECLARE @lEnd int = charindex('''',
                              substring(@sText,
                                        CHARINDEX('''',@sText)+1,
                                        len(@sText)))
DECLARE @sText0 nvarchar(1000)
DECLARE @sColumn1 nvarchar(1000)
DECLARE @sColumn2 nvarchar(1000)
DECLARE @sColumn3 nvarchar(1000)
DECLARE @sColumn4 nvarchar(1000)

DECLARE @iCnt int = 1
while @iCnt<=4
  --(0<len(@sText) and 0<@lBegin and 0<@lEnd)
BEGIN

  SET @sText0 = substring(@sText,@lBegin+1,@lEnd-2)
  IF @iCnt=1 begin SET @sColumn1=@sText0 end
  IF @iCnt=2 begin SET @sColumn2=@sText0 end
  IF @iCnt=3 begin SET @sColumn3=@sText0 end
  IF @iCnt=4 begin SET @sColumn4=@sText0 end

  set @sText = substring(@sText,@lBegin + @lEnd+2,len(@sText))

  SET @lBegin = CHARINDEX('''',@sText)
  SET @lEnd = charindex('''',
                        substring(@sText,
                                  CHARINDEX('''',@sText)+1,
                                  len(@sText)))
  SET @iCnt = @iCnt+1
END

INSERT
    tResults (sColumn1,sColumn2,sColumn3,sColumn4)
    VALUES (@sColumn1,@sColumn2,@sColumn3,@sColumn4)

SELECT * FROM tResults

SQLフィドル

于 2012-10-02T11:27:41.127 に答える
1

これを試して:

declare @delim char
set @delim = ''''
declare @str nvarchar(max)
declare @substr nvarchar(max)
declare @newstr nvarchar(max)
declare @tmpTable table (partStrings nvarchar(max))
declare @count int
set @count = 0
select @str = <***Your String***>
while(charindex(@delim,@str) != 0)
begin
set @count = @count + 1
Select @substr = substring(@str,1,charindex(@delim,@str)-1)
if((@count % 2) = 0)
begin
    insert into @tmpTable values(@substr)
end
Set @newstr = substring(@str,charindex(@delim,@str)+1,len(@str)-charindex(@delim,@str))

set @str = @newstr
end
select partStrings from @tmpTable
于 2012-10-02T09:23:49.793 に答える
1

これは、CHARINDEX() および SUBSTRING() を使用して実現できます。次の例は、2 列に分割する方法を示しています。より多くの列がある場合、クエリはもう少し複雑になります。ただし、これに従ってクエリを作成できます。

SELECT OriginalColumn
, SUBSTRING(OriginalColumn, 1,CHARINDEX('x',OriginalColumn,1)-1) AS Column1
, SUBSTRING(OriginalColumn, CHARINDEX('x',OriginalColumn,1) + 1 ,CHARINDEX('x',OriginalColumn,CHARINDEX('x',OriginalColumn,1)-1)) AS Column2
FROM YourTable

この例では、区切り文字として「x」を使用しています。以下はサンプル結果です

ここに画像の説明を入力

于 2012-10-02T09:18:05.157 に答える