Ich führe eine Abfrage aus select @id=table.id from table
und muss die Ergebnisse durchlaufen, damit ich für jede Zeile eine Speicherprozedur ausführen kannexec stored_proc @varName=@id,@otherVarName='test'
Wie kann ich das in einem T-SQL-Skript tun?
C
, aber ich bezweifle, dass das funktionieren wird. Vielleicht einePHP
Style-Schleife, aber ich bezweifle, dass das auch funktionieren wird. Ich muss alles in T-SQL tun, damit ich SQL in SMS ausführen kann, ohne dass eine externe Sprache die Schleife ausführt ... Hense die Frage an erster Stelle.Antworten:
In diesem Fall können Sie einen CURSOR verwenden:
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
Geändert, um mehrere Parameter aus der Tabelle anzuzeigen.
quelle
@name
, von dem ich glaube, dass er funktionieren wird, aber es ist schon eine Weile her, seit ich jetzt einen Cursor verwendet habe!.Sie könnten so etwas tun:
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
quelle
Meine bevorzugte Lösung ist Microsoft KB 111401 http://support.microsoft.com/kb/111401 .
Der Link bezieht sich auf 3 Beispiele:
In diesem Artikel werden verschiedene Methoden beschrieben, mit denen Sie eine cursorähnliche FETCH-NEXT-Logik in einer gespeicherten Prozedur, einem Trigger oder einem Transact-SQL-Stapel simulieren können.
/*********** 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
quelle
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
quelle
DECLARE @id INT DECLARE @filename NVARCHAR(100) DECLARE @getid CURSOR SET @getid = CURSOR FOR SELECT top 3 id, filename FROM table OPEN @getid WHILE 1=1 BEGIN FETCH NEXT FROM @getid INTO @id, @filename IF @@FETCH_STATUS < 0 BREAK print @id END CLOSE @getid DEALLOCATE @getid
quelle
Versuche dies:
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
quelle