Самый краткий способ преобразовать строку CSV в таблицу в TSQL? - PullRequest
6 голосов
/ 17 сентября 2010
-- Given a CSV string like this:

declare @roles varchar(800)
select  @roles = 'Pub,RegUser,ServiceAdmin'

-- Question: How to get roles into a table view like this:

select  'Pub'
union
select  'RegUser'
union
select  'ServiceAdmin'

После публикации я начал играть с каким-то динамическим SQL.Кажется, это работает, но кажется, что при использовании динамического SQL могут возникать некоторые угрозы безопасности - мысли об этом?

declare @rolesSql varchar(800)
select  @rolesSql = 'select ''' + replace(@roles, ',', ''' union select ''') + ''''
exec(@rolesSql)

Ответы [ 5 ]

11 голосов
/ 17 сентября 2010

Смотрите мой ответ от здесь

Но в основном вы бы:

Создайте эту функцию в вашей БД:

CREATE FUNCTION dbo.Split(@origString varchar(max), @Delimiter char(1))     
returns @temptable TABLE (items varchar(max))     
as     
begin     
    declare @idx int     
    declare @split varchar(max)     

    select @idx = 1     
        if len(@origString )<1 or @origString is null  return     

    while @idx!= 0     
    begin     
        set @idx = charindex(@Delimiter,@origString)     
        if @idx!=0     
            set @split= left(@origString,@idx - 1)     
        else     
            set @split= @origString

        if(len(@split)>0)
            insert into @temptable(Items) values(@split)     

        set @origString= right(@origString,len(@origString) - @idx)     
        if len(@origString) = 0 break     
    end 
return     
end

, а затем вызовите функцию и передайте строку, которую вы хотите разделить.

Select * From dbo.Split(@roles, ',')
10 голосов
/ 21 марта 2017

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

Ссылочная ссылка: https://msdn.microsoft.com/en-gb/library/mt684588.aspx

Использование:

SELECT * FROM string_split('Pub,RegUser,ServiceAdmin',',')

RESULT:

value
-----------
Pub
RegUser
ServiceAdmin
5 голосов
/ 17 сентября 2010

Вот подробное обсуждение ваших вариантов:

1 голос
/ 22 ноября 2017

Также возможно использование встроенного в SQL Server синтаксического анализа XML.Конечно, здесь скрыты все нюансы CSV-совместимого RFC-4180.

-- Given a CSV string like this:
declare @roles varchar(800)
select  @roles = 'Pub,RegUser,ServiceAdmin'

-- Here's the XML way
select split.csv.value('.', 'varchar(100)') as value
from (
     select cast('<x>' + replace(@roles, ',', '</x><x>') + '</x>' as xml) as data
) as csv
cross apply data.nodes('/x') as split(csv)

Если вы используете SQL 2016+, лучше использовать string_split, но это распространенный способ сделать это.до SQL 2016.

0 голосов
/ 17 сентября 2010

Используя BULK INSERT, вы можете импортировать CSV-файл в таблицу SQL -

http://blog.sqlauthority.com/2008/02/06/sql-server-import-csv-file-into-sql-server-using-bulk-insert-load-comma-delimited-file-into-sql-server/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...