Sql server 如何将nvarchar的每7个字符提取到另一个表中?
我在表1中有一个名为ColumnA的NVARCHA200,它包含以下值:Sql server 如何将nvarchar的每7个字符提取到另一个表中?,sql-server,vb.net,tsql,ssis,etl,Sql Server,Vb.net,Tsql,Ssis,Etl,我在表1中有一个名为ColumnA的NVARCHA200,它包含以下值: ABCDEFGHIJKLMNOPQRSTUVWXYZ 我想将每7个字符提取到表2的ColumnB中,最后得到下面所有这些值 ABCDEFG BCDEFGH CDEFGHI DEFGHIJ EFGHIJK FGHIJKL GHIJKLM HIJKLMN IJKLMNO JKLMNOP KLMNOPQ LMNOPQR MNOPQRS NOPQRST OPQRSTU PQRSTUV QRSTUVW RSTUVWX STUVWX
ABCDEFGHIJKLMNOPQRSTUVWXYZ
我想将每7个字符提取到表2的ColumnB中,最后得到下面所有这些值
ABCDEFG
BCDEFGH
CDEFGHI
DEFGHIJ
EFGHIJK
FGHIJKL
GHIJKLM
HIJKLMN
IJKLMNO
JKLMNOP
KLMNOPQ
LMNOPQR
MNOPQRS
NOPQRST
OPQRSTU
PQRSTUV
QRSTUVW
RSTUVWX
STUVWXY
TUVWXYZ
[不是真正的表名和列名。]
数据被加载到SSIS包中的Table1和Table2中,我不知道在SQL任务中用TSQL处理字符串还是在VB脚本组件中解析字符串更好
[是的,我认为我们是地球上最后四个在脚本组件中使用VB的人。我无法说服其他三个说这种C语言的东西会继续存在。不过,也许现在是开始流氓的最佳时机。]你可以用T-SQL这样做:
DECLARE C CURSOR LOCAL FOR SELECT [ColumnA] FROM [Table1]
OPEN C
DECLARE @Val nvarchar(200);
FETCH NEXT FROM C into @Val
WHILE @@FETCH_STATUS = 0 BEGIN
DECLARE @I INTEGER;
SELECT @I = 1;
WHILE @I <= LEN(@vAL)-6 BEGIN
PRINT SUBSTRING(@Val, @I, 7)
SELECT @I = @I + 1
END
FETCH NEXT FROM C into @Val
END
CLOSE C
可以使用递归CTE逐步计算偏移量和子字符串
如果你有一个物理数字表,这很容易。如果没有,您可以动态创建计数: -我们使用行数对任何具有足够行的表创建计数
WITH Tally(Nmbr) AS
(SELECT TOP(LEN(@string)-6) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values)
SELECT Nmbr
,SUBSTRING(@string,Nmbr,7) AS FragmentOf7
FROM Tally
ORDER BY Nmbr;
简而言之:
计数返回从1到n的数字列表=LEN@string-6. 此数字在子字符串中用于定义起始位置 脚本组件解决方案
假设输入列名为Column1
添加脚本组件
打开脚本组件配置窗体
转到“输入和输出”选项卡
单击输出图标并将同步输入属性设置为无
添加输出列示例outColumn1
在脚本编辑器中,在行处理函数中使用类似的代码:
Dim idx作为整数=0
而Row.Column1.length>idx+7
Output0Buffer.AddRow
Output0Buffer.outColumn1=行。
第1列子字符串IDX,7
idx+=1
结束时
我喜欢这种方法,但每当您使用递归CTE动态创建计数时,您必须知道最大深度为100,这可能需要在最外面的查询上使用MAXRECURSION选项,无论何时使用此选项。。。这就是为什么我通过ROW_NUMBER将数字表或解决方案与任何较大的集合进行比较,您可以交叉连接到任何所需的数字。我自己写了一个答案+从我这方面来说,CURSOR是由程序思维的魔鬼引入的,它把我们这些可怜的小数据库人引入了黑暗和邪恶之中。注意基于集合的思维,尽可能避免使用游标、WHILE和多语句函数:-
DECLARE @string VARCHAR(100)='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
WITH Tally(Nmbr) AS
(SELECT TOP(LEN(@string)-6) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values)
SELECT Nmbr
,SUBSTRING(@string,Nmbr,7) AS FragmentOf7
FROM Tally
ORDER BY Nmbr;