-- 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)
小智 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)