我想在SSIS脚本任务中使用这个游标,使用C#,直到所有记录都被解析
我想使用这个游标来解析一个表中的记录,这个表只有一列,一条记录由13行组成。我使用上面的光标手动执行,但现在我希望它从ssis脚本任务运行。直到所有记录都被解析我想在SSIS脚本任务中使用这个游标,使用C#,直到所有记录都被解析,c#,sql,sql-server,ssis,C#,Sql,Sql Server,Ssis,我想使用这个游标来解析一个表中的记录,这个表只有一列,一条记录由13行组成。我使用上面的光标手动执行,但现在我希望它从ssis脚本任务运行。直到所有记录都被解析 谢谢您……没有理由将其编入脚本(任务或组件) 你在干什么?您正在从一个表中删除前13行,并将结果连接在一起,以插入另一个表中。这件事已经被掩盖到了死亡的地步 将执行SQL任务添加到SSIS包中 这是我的桌子 DECLARE @Line1 VARCHAR (MAX) DECLARE @Con_Line1 VARCHAR (MAX) D
谢谢您……没有理由将其编入脚本(任务或组件) 你在干什么?您正在从一个表中删除前13行,并将结果连接在一起,以插入另一个表中。这件事已经被掩盖到了死亡的地步 将执行SQL任务添加到SSIS包中 这是我的桌子
DECLARE @Line1 VARCHAR (MAX)
DECLARE @Con_Line1 VARCHAR (MAX)
DECLARE Pointer CURSOR FOR
SELECT TOP 13 Lines
FROM dbo.Stage_Trdrev_TD
OPEN Pointer
FETCH NEXT FROM Pointer INTO @Line1
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Con_Line1 = ISNULL(@Con_Line1, ''+'01')
+ ISNULL (SUBSTRING(@Line1, 3, 101) + ' ', '')
FETCH NEXT FROM Pointer INTO @Line1
END
SELECT LEFT(@Con_Line1, LEN(@Con_Line1) - 1) AS [Line]
INSERT INTO Parse_Date_TD
VALUES (@Con_Line1)
CLOSE Pointer
DEALLOCATE Pointer
WITH D
AS (SELECT TOP 13 *
FROM dbo.[Stage_Trdrev_TD])
DELETE FROM D
这是实际工作。我创建一个临时表来保存删除的行。这些被删除的行被连接成一行,然后我将其放入已解析的表中
CREATE TABLE
dbo.Stage_Trdrev_TD
(
Lines varchar(100)
);
CREATE TABLE
dbo.Parse_Date_TD
(
Lines varchar(8000)
);
INSERT INTO
dbo.Stage_Trdrev_TD
SELECT
V.name
FROM
master.dbo.spt_values AS V;
注意,如果你的源数据中有空缺,你会得到坏的结果。< /P>请格式化你的代码并解释你的问题,考虑用缩短没有<代码>顺序的标题。你知道这是一个任意的13个记录集,并且在所有可能的情况下,你删除的13个不是你操作的13个。为什么不研究一下如何使用脚本转换并发布一些框架代码呢。最后。。。。你为什么要转换它?这个代码有问题吗?将数据库代码留在数据库中有很多很好的理由。我测试了这些代码,它运行良好。转换为脚本的原因是在ssis包中使用它,因为我希望它一直运行,直到所有记录都被解析,并且可以有n个记录,并且我不希望它手动运行。@ElectricLlama是正确的-top是任意的,没有ORDER BY子句。您在测试中可能会很幸运,但每次执行都无法保证。对于此任务的执行,请使用Execute SQL任务,该任务旨在执行ssis包中的数据库代码。我强烈建议您添加一个ORDER BY。否则,它会在你最不经意的时候破裂,造成严重破坏。在这种情况下,当您随机删除不正确的记录时会发生什么?更糟的是,如果有人在进程中间插入记录,将会发生什么。
------------------
-- Now the "magic"
-------------
DECLARE
@tbl TABLE
(
lines varchar(100)
);
-- Tops without order is nuts
DELETE TOP (13) S
OUTPUT
DELETED.lines
INTO
@tbl
FROM
dbo.Stage_Trdrev_TD AS S
-- Show the data before
SELECT *
FROM @tbl T
-- Show what's about to go in
SELECT DISTINCT
STUFF
(
(
SELECT
',' + T.lines
FROM
@tbl Ti
FOR XML PATH('')
)
,1
,1
,''
) AS ConcatenatedLines
FROM
@tbl T
-- Actually put it in
INSERT INTO
dbo.Parse_Date_TD
SELECT DISTINCT
STUFF
(
(
SELECT
',' + T.lines
FROM
@tbl Ti
FOR XML PATH('')
)
,1
,1
,''
) AS ConcatenatedLines
FROM
@tbl T;