拆分列数据并插入SQL Server存储过程

拆分列数据并插入SQL Server存储过程,sql,sql-server,split,Sql,Sql Server,Split,我有一个有几十万行的表,数据格式是index(int),还有一个单词nvarchar(1000)。单词字符串由空格分隔的单词集合组成,例如word1 word2 word3。我想读单词表并编一本字典。就伪代码而言,这就是我想要的: INSERT INTO dictionary (dictionaryword) SELECt splitBySpace(words) FROM word; 这非常简单,可以用Java或C#编写代码,但我发现系统处理数据需要很长时间。在其他处理中,运行SQL来处理查

我有一个有几十万行的表,数据格式是index(int),还有一个单词nvarchar(1000)。单词字符串由空格分隔的单词集合组成,例如
word1 word2 word3
。我想读单词表并编一本字典。就伪代码而言,这就是我想要的:

INSERT INTO dictionary (dictionaryword) 
SELECt splitBySpace(words) FROM word;
这非常简单,可以用Java或C#编写代码,但我发现系统处理数据需要很长时间。在其他处理中,运行SQL来处理查询(即不使用c#或Java处理数据)的成本效益是巨大的

我想创建一个存储过程,它读取单词,拆分它们,然后创建字典。我看到过各种有点复杂的拆分过程,例如,我看不到如何重新编码,以便读取整个数据库、拆分单词并插入它们

是否有任何示例代码可以拆分列数据,然后插入它,出于效率考虑,这些代码可以完全在SQL中实现?

以下是解决方案

DDL:

DML:


Fiddle

我建议您使用如下存储过程:

CREATE PROCEDURE spSplit 
    @words nvarchar(max),
    @delimiter varchar(1) = ' '
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @sql nvarchar(max)
    SELECT @sql = 'SELECT ''' + REPLACE(@words, @delimiter, ''' As res UNION ALL SELECT ''') + ''''
    --or for removing duplicates SELECT @sql = 'SELECT ''' + REPLACE(@words, @delimiter, ''' As res UNION SELECT ''') + ''''
    EXEC(@sql)
END
GO
此存储过程将为您提供可以在
插入到
语句中使用的结果,以及:

CREATE PROCEDURE spSplit 
    @words nvarchar(max) = 'a bc lkj weu 234 , sdsd 3 and 3 & test',
    @delimiter varchar(1) = ' ',
    @destTable nvarchar(255), 
    @destColumn nvarchar(255)
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @sql nvarchar(max)
    SELECT @sql = 'INSERT INTO [' + @destTable + '] ([' + @destColumn + ']) SELECT res FROM ('
    SELECT @sql = @sql + 'SELECT ''' + REPLACE(@words, @delimiter, ''' As res UNION ALL SELECT ''') + ''''
    SELECT @sql = @sql + ') DT WHERE res NOT IN (SELECT [' + @destColumn + '] FROM [' + @destTable + '])'
    EXEC(@sql)
END
GO

此存储过程将在不插入重复项的情况下进行插入。

虽然在OP没有插入的情况下,最好在答案中包含样本数据的ddl+dml,我建议你把代码块和实际的建议答案分开,让它更清楚。解决方案都很有效,只需几秒钟就可以处理219000个独特的单词。我处理了非唯一的单词(总共约180万个),花了几分钟。
words

a
America
Eyes
in
Once
shut
time
upon
wide
CREATE PROCEDURE spSplit 
    @words nvarchar(max),
    @delimiter varchar(1) = ' '
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @sql nvarchar(max)
    SELECT @sql = 'SELECT ''' + REPLACE(@words, @delimiter, ''' As res UNION ALL SELECT ''') + ''''
    --or for removing duplicates SELECT @sql = 'SELECT ''' + REPLACE(@words, @delimiter, ''' As res UNION SELECT ''') + ''''
    EXEC(@sql)
END
GO
CREATE PROCEDURE spSplit 
    @words nvarchar(max) = 'a bc lkj weu 234 , sdsd 3 and 3 & test',
    @delimiter varchar(1) = ' ',
    @destTable nvarchar(255), 
    @destColumn nvarchar(255)
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @sql nvarchar(max)
    SELECT @sql = 'INSERT INTO [' + @destTable + '] ([' + @destColumn + ']) SELECT res FROM ('
    SELECT @sql = @sql + 'SELECT ''' + REPLACE(@words, @delimiter, ''' As res UNION ALL SELECT ''') + ''''
    SELECT @sql = @sql + ') DT WHERE res NOT IN (SELECT [' + @destColumn + '] FROM [' + @destTable + '])'
    EXEC(@sql)
END
GO