簡體   English   中英

T-SQL中的While循環和拆分功能

[英]While Loop and Split function in T-SQL

我有一個用例,其中我的SQL腳本有一個帶有逗號分隔值的變量。

whitelistURL = abc.com,xyz.com

我必須在變量的所有值上運行insert命令。 類似於用逗號分割,然后在abc.com 運行insert,然后在xyz.com 運行insert

有人可以建議最好的方法嗎? 我是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

唯一需要注意的是,處理后的字符串的末尾也應該有分號(逗號),但是如果沒有,請像我在注釋行中那樣附加它。

然后,插入語句變得非常容易:

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

此函數有兩個參數:

  1. 要拆分的字符串(在您的情況下為'abc.com,xyz.com,xyz.com,'
  2. 分隔符(在您的情況下為','

現在您有了split函數,可以像這樣使用它:

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',',')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM