Ответы пользователя по тегу SQL Server
  • Select из строки?

    alex1t
    @alex1t
    .net developer
    Мы на 2012 используем:
    CREATE FUNCTION [dbo].[CalcHelperString_Split]
    (   
        @str VARCHAR(MAX),
        @delimiter VARCHAR(10)
    )
    RETURNS TABLE 
    AS
    RETURN 
    	SELECT t.c.value('(./text())[1]', 'VARCHAR(MAX)') as item
    	FROM 
    	( 
    		SELECT x = CONVERT(XML, '<i>' + REPLACE(@str, @delimiter, '</i><i>') + '</i>').query('.')
    	) a
    	CROSS APPLY x.nodes('i') t(c)
    	WHERE t.c.value('(./text())[1]', 'VARCHAR(MAX)') is not null;
    GO

    Было найдено на просторах StackOverflow. Работает быстрее всего, что мы смогли найти.

    Поэтому касательно вашего запроса можно сделать так:
    DECLARE @TTT TABLE (column1 VARCHAR(50), column2 VARCHAR(100))
     
    INSERT INTO @TTT (column1, column2)
        VALUES('Какие-то данные 1', 'строка1;строка2;строка3;'),
            ('Какие-то данные 2', 'строка4;строка5;строка6;'),
            ('Какие-то данные 3', 'строка7;'),
            ('Какие-то данные 4', 'строка8;строка9;')
    
    SELECT * FROM @TTT t
    CROSS APPLY dbo.CalcHelperString_Split(t.column2, ';') f
    Ответ написан
    Комментировать
  • Есть ли способ заменять проще?

    alex1t
    @alex1t
    .net developer
    Можно.
    Первый вариант - replace можно вкладывать как функциональном программировании:
    set @Name = replace(replace(replace(@Name,char(10),' '),char(13),' '),'@','_');

    Выглядит не очень, но можно разбить по строкам для читабельности.

    Второй вариант посложнее, но поинтереснее:
    declare @Name varchar(200) = 'abcdefg';
    
    select @Name = replace(@Name, t.c, t.r)
    from (
        values ('a','_'),('b','_'),('c','_')
    ) t(c,r)
    
    print @Name
    Ответ написан
    3 комментария