而循环和拆分功能在T-SQL中

时间:2018-03-07 04:35:53

标签: sql sql-server tsql

我有一个用例,我的SQL脚本中有一个逗号分隔值的变量。

for

我必须对变量的所有值运行insert命令。用逗号分割并运行在abc.com上插入在xyz.com上插入

有人可以建议最好的方法。我是SQL的新手。

我正在使用SQL Server 2014。

2 个答案:

答案 0 :(得分:2)

试试这个:

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

唯一需要注意的是,处理后的字符串最后也应该包含分隔符(逗号),但如果没有,则只需添加它,就像我在注释行中所做的那样。

然后插入语句变得非常简单:

insert into MY_TABLE (url) values
select url from cte

答案 1 :(得分:1)

您可以使用自定义拆分功能。网上有很多这些功能的实现,这是一个例子:

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

此功能有两个参数:

  1. 要拆分的字符串(在您的情况下为'abc.com,xyz.com,xyz.com,'
  2. 分隔符(在您的情况下为','
  3. 现在您已经拥有了分割功能,您可以像这样使用它:

    select [Value] from [dbo].[fn_Split]('abc.com,xyz.com',',')
    

    这是此命令的输出:

    enter image description here

    现在,您可以将其与insert语句结合使用:

    insert into YOUR_TABLE_NAME(YOUR_COLUMN_NAME) 
    select [Value] from [dbo].[fn_Split]('abc.com,xyz.com',',')