Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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
Sql server 如何将nvarchar的每7个字符提取到另一个表中?_Sql Server_Vb.net_Tsql_Ssis_Etl - Fatal编程技术网

Sql server 如何将nvarchar的每7个字符提取到另一个表中?

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

我在表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
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;