반응형
쿼리 결과에 대한 T-SQL 루프
쿼리를 실행하고 select @id=table.id from table
각 행에 대해 저장 프로 시저를 실행할 수 있도록 결과를 반복해야합니다.exec stored_proc @varName=@id,@otherVarName='test'
T-SQL 스크립트에서 어떻게 할 수 있습니까?
이 경우 CURSOR를 사용할 수 있습니다.
DECLARE @id INT
DECLARE @name NVARCHAR(100)
DECLARE @getid CURSOR
SET @getid = CURSOR FOR
SELECT table.id,
table.name
FROM table
OPEN @getid
FETCH NEXT
FROM @getid INTO @id, @name
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC stored_proc @varName=@id, @otherVarName='test', @varForName=@name
FETCH NEXT
FROM @getid INTO @id, @name
END
CLOSE @getid
DEALLOCATE @getid
테이블의 여러 매개 변수를 표시하도록 수정되었습니다.
다음과 같이 할 수 있습니다.
create procedure test
as
BEGIN
create table #ids
(
rn int,
id int
)
insert into #ids (rn, id)
select distinct row_number() over(order by id) as rn, id
from table
declare @id int
declare @totalrows int = (select count(*) from #ids)
declare @currentrow int = 0
while @currentrow < @totalrows
begin
set @id = (select id from #ids where rn = @currentrow)
exec stored_proc @varName=@id, @otherVarName='test'
set @currentrow = @currentrow +1
end
END
내가 선호하는 솔루션은 Microsoft KB 111401 http://support.microsoft.com/kb/111401 입니다.
링크는 세 가지 예를 참조합니다.
이 문서에서는 저장 프로 시저, 트리거 또는 Transact-SQL 일괄 처리에서 커서와 유사한 FETCH-NEXT 논리를 시뮬레이션하는 데 사용할 수있는 다양한 방법을 설명합니다.
/*********** example 1 ***********/
declare @au_id char( 11 )
set rowcount 0
select * into #mytemp from authors
set rowcount 1
select @au_id = au_id from #mytemp
while @@rowcount <> 0
begin
set rowcount 0
select * from #mytemp where au_id = @au_id
delete #mytemp where au_id = @au_id
set rowcount 1
select @au_id = au_id from #mytemp
end
set rowcount 0
/********** example 2 **********/
declare @au_id char( 11 )
select @au_id = min( au_id ) from authors
while @au_id is not null
begin
select * from authors where au_id = @au_id
select @au_id = min( au_id ) from authors where au_id > @au_id
end
/********** example 3 **********/
set rowcount 0
select NULL mykey, * into #mytemp from authors
set rowcount 1
update #mytemp set mykey = 1
while @@rowcount > 0
begin
set rowcount 0
select * from #mytemp where mykey = 1
delete #mytemp where mykey = 1
set rowcount 1
update #mytemp set mykey = 1
end
set rowcount 0
DECLARE @id INT
DECLARE @name NVARCHAR(100)
DECLARE @getid CURSOR
SET @getid = CURSOR FOR
SELECT table.id,
table.name
FROM table
WHILE 1=1
BEGIN
FETCH NEXT
FROM @getid INTO @id, @name
IF @@FETCH_STATUS < 0 BREAK
EXEC stored_proc @varName=@id, @otherVarName='test', @varForName=@name
END
CLOSE @getid
DEALLOCATE @getid
이 시도:
declare @i tinyint = 0,
@count tinyint,
@id int,
@name varchar(max)
select @count = count(*) from table
while (@i < @count)
begin
select @id = id, @name = name from table
order by nr asc offset @i rows fetch next 1 rows only
exec stored_proc @varName = @id, @otherVarName = 'test', @varForName = @name
set @i = @i + 1
end
참고 URL : https://stackoverflow.com/questions/11852782/t-sql-loop-over-query-results
반응형
'UFO ET IT' 카테고리의 다른 글
지원 벡터의 수와 훈련 데이터 및 분류기 성능 간의 관계는 무엇입니까? (0) | 2020.11.09 |
---|---|
Facebook 좋아요 상자를 반응 형으로 만드는 방법은 무엇입니까? (0) | 2020.11.09 |
Rails 컨트롤러를위한 Ruby 도우미 메서드를 어디에 넣을까요? (0) | 2020.11.09 |
파이썬 집합 이해력 (0) | 2020.11.08 |
은 무슨 뜻인가요? (0) | 2020.11.08 |