Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL中的While循环和Split函数_Sql_Sql Server_Tsql - Fatal编程技术网

T-SQL中的While循环和Split函数

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 =

我的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 + ','
;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
此函数采用两个参数:

  • 要拆分的字符串(在您的示例中为“abc.com、xyz.com、xyz.com”)
  • 分隔符(在您的示例中为“
    ”,“
  • 现在您有了拆分函数,可以这样使用它:

    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
    
    此函数采用两个参数:

  • 要拆分的字符串(在您的示例中为“abc.com、xyz.com、xyz.com”)
  • 分隔符(在您的示例中为“
    ”,“
  • 现在您有了拆分函数,可以这样使用它:

    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
    ?如果可能,应该避免使用分隔字符串,而是使用表值参数。