最简洁的方法是将CSV字符串转换为TSQL中的表格?

Pau*_*yer 7 t-sql csv

-- 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'
Run Code Online (Sandbox Code Playgroud)

发布后,我开始玩一些动态SQL.这似乎有效,但似乎使用动态SQL可能存在一些安全风险 - 对此有何看法?

declare @rolesSql varchar(800)
select  @rolesSql = 'select ''' + replace(@roles, ',', ''' union select ''') + ''''
exec(@rolesSql)
Run Code Online (Sandbox Code Playgroud)

cod*_*ger 11

这里看我的答案

但基本上你会:

在您的数据库中创建此功能:

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
Run Code Online (Sandbox Code Playgroud)

然后调用该函数并传入要拆分的字符串.

Select * From dbo.Split(@roles, ',')
Run Code Online (Sandbox Code Playgroud)

  • TVF是吗?难道不是SELECT*FROM dbo.Split(@roles,',')?? (2认同)

小智 10

如果您正在使用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
Run Code Online (Sandbox Code Playgroud)


Luk*_*keH 5

以下是对您的选择的全面讨论: