T-SQL中的While循环和Split函数
我的SQL脚本有一个使用逗号分隔值的变量的用例T-SQL中的While循环和Split函数,sql,sql-server,tsql,Sql,Sql Server,Tsql,我的SQL脚本有一个使用逗号分隔值的变量的用例 whitelistURL = abc.com,xyz.com 我必须对变量的所有值运行insert命令。类似于使用逗号拆分并在abc.com上运行插入和在xyz.com上运行插入 有人能建议最好的方法吗。我是SQL新手 我正在使用SQL Server 2014。请尝试以下操作: declare @whitelistURL varchar(100) = 'abc.com,xyz.com,xyz.com,' --set @whitelistURL =
whitelistURL = abc.com,xyz.com
我必须对变量的所有值运行insert命令。类似于使用逗号拆分并在abc.com上运行插入和在xyz.com上运行插入
有人能建议最好的方法吗。我是SQL新手
我正在使用SQL Server 2014。请尝试以下操作:
declare @whitelistURL varchar(100) = 'abc.com,xyz.com,xyz.com,'
--set @whitelistURL = @whitelistURL + ','
;with cte as(
select charindex(',', @whitelistURL) [n], SUBSTRING(@whitelistURL, 1,
charindex(',', @whitelistURL) - 1) [url]
union all
select charindex(',', @whitelistURL, n + 1), SUBSTRING(@whitelistURL, n + 1, charindex(',', @whitelistURL, n + 1) - n - 1) from cte
where charindex(',', @whitelistURL, n + 1) > 0
)
select [url] from cte
唯一需要注意的是,处理后的字符串的末尾也应该有delimeter(逗号),但如果它没有,只需附加它,就像我在注释行中所做的那样
然后insert语句变得非常简单:
insert into MY_TABLE (url) values
select url from cte
试试这个:
declare @whitelistURL varchar(100) = 'abc.com,xyz.com,xyz.com,'
--set @whitelistURL = @whitelistURL + ','
;with cte as(
select charindex(',', @whitelistURL) [n], SUBSTRING(@whitelistURL, 1,
charindex(',', @whitelistURL) - 1) [url]
union all
select charindex(',', @whitelistURL, n + 1), SUBSTRING(@whitelistURL, n + 1, charindex(',', @whitelistURL, n + 1) - n - 1) from cte
where charindex(',', @whitelistURL, n + 1) > 0
)
select [url] from cte
唯一需要注意的是,处理后的字符串的末尾也应该有delimeter(逗号),但如果它没有,只需附加它,就像我在注释行中所做的那样
然后insert语句变得非常简单:
insert into MY_TABLE (url) values
select url from cte
您可以使用自定义拆分函数。这些功能在web上有很多实现,下面是一个示例:
CREATE FUNCTION [dbo].[fn_Split] (@Text nvarchar(MAX), @Delim char(1))
RETURNS @Values TABLE (Value nvarchar(MAX))
AS
BEGIN
SET @Text = RTRIM(LTRIM(@Text))
DECLARE @chrind int
DECLARE @Piece nvarchar(100)
SELECT @chrind = 1
WHILE @chrind > 0
BEGIN
SELECT @chrind = CHARINDEX(@Delim, @Text)
IF @chrind > 0
SELECT @Piece = RTRIM(LTRIM(LEFT(@Text, @chrind - 1)))
ELSE
SELECT @Piece = RTRIM(LTRIM(@Text))
INSERT @Values(Value) VALUES(CAST(@Piece as varchar(100)))
SELECT @Text = RIGHT(@Text, LEN(@Text) - @chrind)
IF LEN(@Text) = 0 BREAK
END
RETURN
END
此函数采用两个参数:
”,“
)select [Value] from [dbo].[fn_Split]('abc.com,xyz.com',',')
这是此命令的输出:
现在,您可以将其与insert
语句结合使用:
insert into YOUR_TABLE_NAME(YOUR_COLUMN_NAME)
select [Value] from [dbo].[fn_Split]('abc.com,xyz.com',',')
您可以使用自定义拆分函数。这些功能在web上有很多实现,下面是一个示例:
CREATE FUNCTION [dbo].[fn_Split] (@Text nvarchar(MAX), @Delim char(1))
RETURNS @Values TABLE (Value nvarchar(MAX))
AS
BEGIN
SET @Text = RTRIM(LTRIM(@Text))
DECLARE @chrind int
DECLARE @Piece nvarchar(100)
SELECT @chrind = 1
WHILE @chrind > 0
BEGIN
SELECT @chrind = CHARINDEX(@Delim, @Text)
IF @chrind > 0
SELECT @Piece = RTRIM(LTRIM(LEFT(@Text, @chrind - 1)))
ELSE
SELECT @Piece = RTRIM(LTRIM(@Text))
INSERT @Values(Value) VALUES(CAST(@Piece as varchar(100)))
SELECT @Text = RIGHT(@Text, LEN(@Text) - @chrind)
IF LEN(@Text) = 0 BREAK
END
RETURN
END
此函数采用两个参数:
”,“
)select [Value] from [dbo].[fn_Split]('abc.com,xyz.com',',')
这是此命令的输出:
现在,您可以将其与insert
语句结合使用:
insert into YOUR_TABLE_NAME(YOUR_COLUMN_NAME)
select [Value] from [dbo].[fn_Split]('abc.com,xyz.com',',')
您从哪里获得
白名单URL
?如果可能,您应该避免使用分隔字符串,而是使用表值参数。您从哪里获取白名单URL
?如果可能,应该避免使用分隔字符串,而是使用表值参数。