Мне нужна функция в SQL Server, чтобы вставить пробел в каждой позиции входной строки - PullRequest
3 голосов
/ 18 декабря 2011

Мне нужна функция в SQL Server, чтобы вставить пробел в каждой позиции входной строки. Например, если вход функции

"example"

вывод функции должен быть

word1   word2
e       xample
ex      ample
exa     mple
exam    ple
examp   le
exampl  e

Ответы [ 3 ]

3 голосов
/ 18 декабря 2011
declare @S varchar(20) = 'example'

select left(@S, number) as word1,
       stuff(@S, 1, number, '') as word2
from master..spt_values
where type = 'P' and
      number between 1 and len(@S)-1

Или вот так, если вам нужен один столбец с вставленным пробелом:

select stuff(@S, number, 0, ' ') as word
from master..spt_values
where type = 'P' and
      number between 2 and len(@S)      
2 голосов
/ 18 декабря 2011

@ Одед прав - такое правило лучше всего делать в коде приложения, как правило.

Сказав это, всегда весело, чтобы пойти. Следующая функция будет обрабатывать то, что вы хотите:

CREATE FUNCTION dbo.SplitString(@input VARCHAR(MAX))
RETURNS @splits table (word1 varchar(MAX), word2 varchar(MAX))
AS
BEGIN

;WITH Numbers ( n ) AS (
    SELECT 1 UNION ALL
    SELECT 1 + n FROM Numbers WHERE n < LEN(@input)-1 )
INSERT @splits
SELECT
    word1 = SUBSTRING(@input,1,n),
    word2 = SUBSTRING(@input,n+1,LEN(@Input) - n)
FROM Numbers
OPTION ( MAXRECURSION 0 )

RETURN

END

Вызывается с помощью:

select * from dbo.SplitString('example')
2 голосов
/ 18 декабря 2011

Попробуйте:

CREATE FUNCTION dbo.SplitString(@Input VARCHAR(100))
RETURNS @tblStringSplitted TABLE 
(
    -- Columns returned by the function
    word1 VARCHAR(100),
    word2 VARCHAR(100)
)
AS 
BEGIN
    DECLARE @IX INT
    DECLARE @MAX INT

    SET @IX = 2
    SET @MAX = LEN(@Input)

    WHILE (@IX <= @MAX)
    BEGIN
        INSERT INTO @tblStringSplitted(word1, word2)
        VALUES(
            SUBSTRING(@Input, 1, @IX-1),
            SUBSTRING(@Input, @IX, @MAX-@IX+1)
        )       
        SET @IX = @IX + 1
    END

    RETURN;
END;
GO

Вызов:

SELECT * FROM dbo.SplitString('example')

вернет:

word1     word2
e         xample
ex        ample
exa       mple
exam      ple
examp     le
exampl    e
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...