Cursor never stops
I appear to have made an error in this cursor and I can't seem to figure out what I have done wrong.
I've confirmed that the select
pulls back 2 rows. But when I pass it into the cursor to pick appear the string and I can extract the exact value I need. The two rows look something like the following...
|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|
|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|
The cursor appears to grab the 1st row and continually loop around never getting onto the next row or end the program.
declare
@clobstringP varchar(max),
@clobstring varchar(max);
declare SevenCursor cursor for
select [value] as ClobP
from string_split(@clobstring, '>')
where value like '%<|2|%';
open SevenCursor;
fetch next from SevenCursor into @clobstringP;
while @@FETCH_STATUS = 0
begin
insert into [database].dbo.tablestuff ( ValueP )
select file387
from (
select
RowId387 = row_number() over( order by ( select 1 ) )
,file387 = [value]
from string_split(@clobstringP, '|')
) a
where a.RowId387 = 6;
end;
close SevenCursor;
deallocate SevenCursor;
Can someone point me in the right direction?
sql-server t-sql cursors
add a comment |
I appear to have made an error in this cursor and I can't seem to figure out what I have done wrong.
I've confirmed that the select
pulls back 2 rows. But when I pass it into the cursor to pick appear the string and I can extract the exact value I need. The two rows look something like the following...
|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|
|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|
The cursor appears to grab the 1st row and continually loop around never getting onto the next row or end the program.
declare
@clobstringP varchar(max),
@clobstring varchar(max);
declare SevenCursor cursor for
select [value] as ClobP
from string_split(@clobstring, '>')
where value like '%<|2|%';
open SevenCursor;
fetch next from SevenCursor into @clobstringP;
while @@FETCH_STATUS = 0
begin
insert into [database].dbo.tablestuff ( ValueP )
select file387
from (
select
RowId387 = row_number() over( order by ( select 1 ) )
,file387 = [value]
from string_split(@clobstringP, '|')
) a
where a.RowId387 = 6;
end;
close SevenCursor;
deallocate SevenCursor;
Can someone point me in the right direction?
sql-server t-sql cursors
add a comment |
I appear to have made an error in this cursor and I can't seem to figure out what I have done wrong.
I've confirmed that the select
pulls back 2 rows. But when I pass it into the cursor to pick appear the string and I can extract the exact value I need. The two rows look something like the following...
|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|
|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|
The cursor appears to grab the 1st row and continually loop around never getting onto the next row or end the program.
declare
@clobstringP varchar(max),
@clobstring varchar(max);
declare SevenCursor cursor for
select [value] as ClobP
from string_split(@clobstring, '>')
where value like '%<|2|%';
open SevenCursor;
fetch next from SevenCursor into @clobstringP;
while @@FETCH_STATUS = 0
begin
insert into [database].dbo.tablestuff ( ValueP )
select file387
from (
select
RowId387 = row_number() over( order by ( select 1 ) )
,file387 = [value]
from string_split(@clobstringP, '|')
) a
where a.RowId387 = 6;
end;
close SevenCursor;
deallocate SevenCursor;
Can someone point me in the right direction?
sql-server t-sql cursors
I appear to have made an error in this cursor and I can't seem to figure out what I have done wrong.
I've confirmed that the select
pulls back 2 rows. But when I pass it into the cursor to pick appear the string and I can extract the exact value I need. The two rows look something like the following...
|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|
|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|
The cursor appears to grab the 1st row and continually loop around never getting onto the next row or end the program.
declare
@clobstringP varchar(max),
@clobstring varchar(max);
declare SevenCursor cursor for
select [value] as ClobP
from string_split(@clobstring, '>')
where value like '%<|2|%';
open SevenCursor;
fetch next from SevenCursor into @clobstringP;
while @@FETCH_STATUS = 0
begin
insert into [database].dbo.tablestuff ( ValueP )
select file387
from (
select
RowId387 = row_number() over( order by ( select 1 ) )
,file387 = [value]
from string_split(@clobstringP, '|')
) a
where a.RowId387 = 6;
end;
close SevenCursor;
deallocate SevenCursor;
Can someone point me in the right direction?
sql-server t-sql cursors
sql-server t-sql cursors
edited Jan 23 at 11:41
Peter Vandivier
1,2141722
1,2141722
asked Jan 23 at 11:00
TuckRollworthyTuckRollworthy
243
243
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
As Peter has pointed out, your loop will never end since you don't do a fetch inside the loop. I prefer to have only one FETCH to maintain instead of two. So, my loop structure for a cursor is as follows:
WHILE 1 = 1
BEGIN
FETCH NEXT FROM OrdersCursor INTO @sales_person_id, @orderdate;
IF @@FETCH_STATUS <> 0
BREAK
--Whatever it is I'm doing inside the loop
END
A matter of taste which you prefer...
add a comment |
The cursor will loop infinitely unless and until @@fetchstatus = 0
. In order to reach that state, you need to proceed through the dataset. In order to do that, you should add fetch next from SevenCursor into @clobstringP;
to the inside of the begin ... end
block so that the cursor has something to iterate over.
It is perhaps prudent to editorialize a bit at this stage and recommend that you try to ditch the cursor entirely. Cursors are pretty nifty but are misused more often than not; and from your provided psuedo-code, it seems that perhaps you may be trying to fix X
when you could bypass to Y
.
I might suggestion taking the whole result set and string_split
-ing it into a sensible #temp_table
. When you've performed any necessary updates/deletes on this cached result set and verified it's suitable, try for a single insert into dbo.tablestuff ...
to succeed or fail based on batch evaluated rules. For example:
declare @pipe_delimited_rows table (
my_row varchar(max)
);
insert @pipe_delimited_rows ( my_row )
values
(N'|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|'),
(N'|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|');
drop table if exists #cache_results;
create table #cache_results (
id int identity not null primary key
,ClobP nvarchar(max)
);
insert #cache_results ( ClobP )
select ss.[value] as ClobP
from @pipe_delimited_rows pdr
cross apply string_split(pdr.my_row, '>') ss -- delimiting appropriately here, of course
where ss.[value] like '%<|2|%';
/* perform business logic to validate interim results here */
insert into [database].dbo.tablestuff ( ValueP )
select ClobP
from #cache_results;
Disclaimers
- The sample pseudo-code won't run sensibly as is. I'm kind of patching together from rev 1 of your OP. You'll of course need to delimit on the proper delimiter and perform the appropriate transformations to your live dataset.
- It's worth noting that there is NO way to enforce order-of-elements within string_split at this time.
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "182"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdba.stackexchange.com%2fquestions%2f227854%2fcursor-never-stops%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
As Peter has pointed out, your loop will never end since you don't do a fetch inside the loop. I prefer to have only one FETCH to maintain instead of two. So, my loop structure for a cursor is as follows:
WHILE 1 = 1
BEGIN
FETCH NEXT FROM OrdersCursor INTO @sales_person_id, @orderdate;
IF @@FETCH_STATUS <> 0
BREAK
--Whatever it is I'm doing inside the loop
END
A matter of taste which you prefer...
add a comment |
As Peter has pointed out, your loop will never end since you don't do a fetch inside the loop. I prefer to have only one FETCH to maintain instead of two. So, my loop structure for a cursor is as follows:
WHILE 1 = 1
BEGIN
FETCH NEXT FROM OrdersCursor INTO @sales_person_id, @orderdate;
IF @@FETCH_STATUS <> 0
BREAK
--Whatever it is I'm doing inside the loop
END
A matter of taste which you prefer...
add a comment |
As Peter has pointed out, your loop will never end since you don't do a fetch inside the loop. I prefer to have only one FETCH to maintain instead of two. So, my loop structure for a cursor is as follows:
WHILE 1 = 1
BEGIN
FETCH NEXT FROM OrdersCursor INTO @sales_person_id, @orderdate;
IF @@FETCH_STATUS <> 0
BREAK
--Whatever it is I'm doing inside the loop
END
A matter of taste which you prefer...
As Peter has pointed out, your loop will never end since you don't do a fetch inside the loop. I prefer to have only one FETCH to maintain instead of two. So, my loop structure for a cursor is as follows:
WHILE 1 = 1
BEGIN
FETCH NEXT FROM OrdersCursor INTO @sales_person_id, @orderdate;
IF @@FETCH_STATUS <> 0
BREAK
--Whatever it is I'm doing inside the loop
END
A matter of taste which you prefer...
answered Jan 23 at 11:52
Tibor KarasziTibor Karaszi
1,9087
1,9087
add a comment |
add a comment |
The cursor will loop infinitely unless and until @@fetchstatus = 0
. In order to reach that state, you need to proceed through the dataset. In order to do that, you should add fetch next from SevenCursor into @clobstringP;
to the inside of the begin ... end
block so that the cursor has something to iterate over.
It is perhaps prudent to editorialize a bit at this stage and recommend that you try to ditch the cursor entirely. Cursors are pretty nifty but are misused more often than not; and from your provided psuedo-code, it seems that perhaps you may be trying to fix X
when you could bypass to Y
.
I might suggestion taking the whole result set and string_split
-ing it into a sensible #temp_table
. When you've performed any necessary updates/deletes on this cached result set and verified it's suitable, try for a single insert into dbo.tablestuff ...
to succeed or fail based on batch evaluated rules. For example:
declare @pipe_delimited_rows table (
my_row varchar(max)
);
insert @pipe_delimited_rows ( my_row )
values
(N'|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|'),
(N'|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|');
drop table if exists #cache_results;
create table #cache_results (
id int identity not null primary key
,ClobP nvarchar(max)
);
insert #cache_results ( ClobP )
select ss.[value] as ClobP
from @pipe_delimited_rows pdr
cross apply string_split(pdr.my_row, '>') ss -- delimiting appropriately here, of course
where ss.[value] like '%<|2|%';
/* perform business logic to validate interim results here */
insert into [database].dbo.tablestuff ( ValueP )
select ClobP
from #cache_results;
Disclaimers
- The sample pseudo-code won't run sensibly as is. I'm kind of patching together from rev 1 of your OP. You'll of course need to delimit on the proper delimiter and perform the appropriate transformations to your live dataset.
- It's worth noting that there is NO way to enforce order-of-elements within string_split at this time.
add a comment |
The cursor will loop infinitely unless and until @@fetchstatus = 0
. In order to reach that state, you need to proceed through the dataset. In order to do that, you should add fetch next from SevenCursor into @clobstringP;
to the inside of the begin ... end
block so that the cursor has something to iterate over.
It is perhaps prudent to editorialize a bit at this stage and recommend that you try to ditch the cursor entirely. Cursors are pretty nifty but are misused more often than not; and from your provided psuedo-code, it seems that perhaps you may be trying to fix X
when you could bypass to Y
.
I might suggestion taking the whole result set and string_split
-ing it into a sensible #temp_table
. When you've performed any necessary updates/deletes on this cached result set and verified it's suitable, try for a single insert into dbo.tablestuff ...
to succeed or fail based on batch evaluated rules. For example:
declare @pipe_delimited_rows table (
my_row varchar(max)
);
insert @pipe_delimited_rows ( my_row )
values
(N'|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|'),
(N'|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|');
drop table if exists #cache_results;
create table #cache_results (
id int identity not null primary key
,ClobP nvarchar(max)
);
insert #cache_results ( ClobP )
select ss.[value] as ClobP
from @pipe_delimited_rows pdr
cross apply string_split(pdr.my_row, '>') ss -- delimiting appropriately here, of course
where ss.[value] like '%<|2|%';
/* perform business logic to validate interim results here */
insert into [database].dbo.tablestuff ( ValueP )
select ClobP
from #cache_results;
Disclaimers
- The sample pseudo-code won't run sensibly as is. I'm kind of patching together from rev 1 of your OP. You'll of course need to delimit on the proper delimiter and perform the appropriate transformations to your live dataset.
- It's worth noting that there is NO way to enforce order-of-elements within string_split at this time.
add a comment |
The cursor will loop infinitely unless and until @@fetchstatus = 0
. In order to reach that state, you need to proceed through the dataset. In order to do that, you should add fetch next from SevenCursor into @clobstringP;
to the inside of the begin ... end
block so that the cursor has something to iterate over.
It is perhaps prudent to editorialize a bit at this stage and recommend that you try to ditch the cursor entirely. Cursors are pretty nifty but are misused more often than not; and from your provided psuedo-code, it seems that perhaps you may be trying to fix X
when you could bypass to Y
.
I might suggestion taking the whole result set and string_split
-ing it into a sensible #temp_table
. When you've performed any necessary updates/deletes on this cached result set and verified it's suitable, try for a single insert into dbo.tablestuff ...
to succeed or fail based on batch evaluated rules. For example:
declare @pipe_delimited_rows table (
my_row varchar(max)
);
insert @pipe_delimited_rows ( my_row )
values
(N'|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|'),
(N'|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|');
drop table if exists #cache_results;
create table #cache_results (
id int identity not null primary key
,ClobP nvarchar(max)
);
insert #cache_results ( ClobP )
select ss.[value] as ClobP
from @pipe_delimited_rows pdr
cross apply string_split(pdr.my_row, '>') ss -- delimiting appropriately here, of course
where ss.[value] like '%<|2|%';
/* perform business logic to validate interim results here */
insert into [database].dbo.tablestuff ( ValueP )
select ClobP
from #cache_results;
Disclaimers
- The sample pseudo-code won't run sensibly as is. I'm kind of patching together from rev 1 of your OP. You'll of course need to delimit on the proper delimiter and perform the appropriate transformations to your live dataset.
- It's worth noting that there is NO way to enforce order-of-elements within string_split at this time.
The cursor will loop infinitely unless and until @@fetchstatus = 0
. In order to reach that state, you need to proceed through the dataset. In order to do that, you should add fetch next from SevenCursor into @clobstringP;
to the inside of the begin ... end
block so that the cursor has something to iterate over.
It is perhaps prudent to editorialize a bit at this stage and recommend that you try to ditch the cursor entirely. Cursors are pretty nifty but are misused more often than not; and from your provided psuedo-code, it seems that perhaps you may be trying to fix X
when you could bypass to Y
.
I might suggestion taking the whole result set and string_split
-ing it into a sensible #temp_table
. When you've performed any necessary updates/deletes on this cached result set and verified it's suitable, try for a single insert into dbo.tablestuff ...
to succeed or fail based on batch evaluated rules. For example:
declare @pipe_delimited_rows table (
my_row varchar(max)
);
insert @pipe_delimited_rows ( my_row )
values
(N'|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|'),
(N'|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|');
drop table if exists #cache_results;
create table #cache_results (
id int identity not null primary key
,ClobP nvarchar(max)
);
insert #cache_results ( ClobP )
select ss.[value] as ClobP
from @pipe_delimited_rows pdr
cross apply string_split(pdr.my_row, '>') ss -- delimiting appropriately here, of course
where ss.[value] like '%<|2|%';
/* perform business logic to validate interim results here */
insert into [database].dbo.tablestuff ( ValueP )
select ClobP
from #cache_results;
Disclaimers
- The sample pseudo-code won't run sensibly as is. I'm kind of patching together from rev 1 of your OP. You'll of course need to delimit on the proper delimiter and perform the appropriate transformations to your live dataset.
- It's worth noting that there is NO way to enforce order-of-elements within string_split at this time.
edited Jan 23 at 12:49
answered Jan 23 at 11:38
Peter VandivierPeter Vandivier
1,2141722
1,2141722
add a comment |
add a comment |
Thanks for contributing an answer to Database Administrators Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdba.stackexchange.com%2fquestions%2f227854%2fcursor-never-stops%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown