1

我有一个接受类型参数的存储过程VARCHAR(MAX)。该参数具有用逗号分隔的字符串,例如

@test = 'test123,test456,test789';

基于该参数,我想生成多个插入语句。

我将使用这个问题中定义的 split 函数:Split string by comma in SQL Server 2008

你能告诉我一个例子如何在用逗号分割字符串后生成插入吗?

逻辑步骤应该是这样的:

@test = 'test123,test456,test789';
split @test
use while or cursor ? (I don't know)
INSERT INTO X values ('test123')
INSERT INTO X values ('test456')
...
4

4 回答 4

2
DECLARE @id VARCHAR(MAX)

SET @id = 'test123,test456,test789,'

WHILE CHARINDEX(',', @id) > 0 
BEGIN

DECLARE @tmpstr VARCHAR(50)
 SET @tmpstr = SUBSTRING(@id, 1, ( CHARINDEX(',', @id) - 1 ))

INSERT  INTO X

VALUES  ( 
          @tmpstr
        )
SET @id = SUBSTRING(@id, CHARINDEX(',', @id) + 1, LEN(@id))
END
于 2013-02-15T08:19:08.510 回答
1

像下面这样尝试它会帮助你...

在这里你不需要任何用户定义的函数......你只需使用下面的代码并得到你的结果......

DECLARE @test NVARCHAR(MAX)
SET @test = 'test123,test456,test789'
SET @test = ',' + @test + ','
DECLARE @Part NVARCHAR(MAX)
DECLARE @INDEX    INT
SET @INDEX = CHARINDEX(',',@test)
DECLARE @EIND INT set @EIND = 0

WHILE(@INDEX != LEN(@test))
BEGIN
    SET  @EIND = ISNULL(((CHARINDEX(',', @test, @INDEX + 1)) - @INDEX - 1), 0)

    INSERT INTO X SELECT (SUBSTRING(@test, (@INDEX  + 1),  @EIND)) -- Insert Comes Here

    SELECT @INDEX = ISNULL(CHARINDEX(',', @test, @INDEX + 1), 0)
END
于 2013-02-15T08:34:20.587 回答
0

您可以动态创建 SQL 语句,然后运行该命令。实际上循环它对您来说不是必需的。此脚本在一个 INSERT 语句中提供多次插入

DECLARE @test nvarchar(100) = 'test123,test456,test789';  
DECLARE @dml nvarchar(max) = N''
SET @dml = 'INSERT [dbo].[test2] VALUES' + '(''' + REPLACE(@test, ',', '''),(''') + ''')'
EXEC sp_executesql @dml

您也可以使用带有动态管理功能sys.dm_fts_parser的选项

SELECT FULLTEXTSERVICEPROPERTY ('IsFulltextInstalled')

0 = 未安装全文。1 = 已安装全文。NULL = 无效输入或错误。

如果 0 = 全文未安装,那么这篇文章对您来说是必要的如何在 sql server 2008 上安装全文?

DECLARE @test nvarchar(100) = 'test123,test456,test789';
INSERT [dbo].[test2]
SELECT display_term
FROM sys.dm_fts_parser('"' + @test + '"', 1033, NULL, 0)
于 2013-02-15T08:13:52.157 回答
-1

此查询将拆分字符串,然后循环结果以构造插入注释。

declare @test varchar(30) = 'test123,test456,test789';

-- retrieve number of comma(s) in @test
declare @i int = len(@test) - len(replace(@test,',','')) + 1
declare @cmd nvarchar(255)

-- loop
while @i >= 0
begin
    select @cmd = 'INSERT INTO X VALUES (''' +  parsename(replace(@test, ',', '.'), @i) + ''');';
    -- execute sql
    exec sp_executesql @cmd
    set @i = @i - 1
end
于 2013-02-15T08:19:24.467 回答