Скажите, что у меня есть этот большой запрос в моей хранимой процедуре.
Select * from Temp
Как я сохранил бы результаты этого в той же хранимой процедуре с тех пор в следующей строке, я хочу пройти ее в цикле (я не знаю, как сделать это уже любой), и действительно наполните к ней.
Я нашел что-то вроде этого
DECLARE total_count INT DEFAULT 0
SET total_count = 10;
но это походит, который не работает.
Msg 156, Level 15, State 1, Procedure csp_test, Line 3
Incorrect syntax near the keyword 'DECLARE'.
Msg 155, Level 15, State 2, Procedure csp_test, Line 3
'INT' is not a recognized CURSOR option.
Править
Хорошо это - то, что я иду до сих пор. У меня нет подсказки, что я делаю так, я не знаю, удаленно ли это правильно.
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [dbo].[csp_test]
AS
BEGIN
declare @temp2 table (
idx int identity(1,1),
field varchar(max))
insert into @temp2 (field)
Select * from temp
END
Таким образом, то, Что я думаю, что это делает, является этим, делает некоторую табличную переменную, затем вставляет все мои результаты временной таблицы в эту temp2 табличную переменную. Затем я циклично выполняюсь через них или что-то как этот?
Я не делаю, если то, что я имею, до сих пор правильно. Я затем нашел это и не уверенным, если это будет следующим шагом
declare @counter int
set @counter = 1
while @counter < (select max(idx) from @temp)
begin
-- do what you want with the rows here
set @counter = @counter + 1
end
Временный сценарий Таблицы
USE [test]
GO
/****** Object: Table [dbo].[temp] Script Date: 07/06/2010 19:20:34 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[temp](
[id] [int] IDENTITY(1,1) NOT NULL,
[temp] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
CONSTRAINT [PK_temp] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
Это удобный шаблон для создания временной таблицы, заполнения данными, а затем перемещения по данным по какой-то причине
-- create temp table
CREATE TABLE #tmp (field1 int, field2 varchar(10)) ON [PRIMARY]
-- populate temp table
insert into #tmp (field1, field2)
select something1, something2
from someTable
-- variables for cursor through temp table
declare @field1 int
declare @field2 varchar(10)
-- open cursor
declare myCursor Cursor for select field1, field2 from #tmp
open myCursor
-- get 1st row of data
fetch next from myCursor into @field1, @field2
-- loop through the data
while @@fetch_status = 0 begin
-- do sumthin.. data is in @field1 and @field2
-- get next row
fetch next from myCursor into @field1, @field2
end
-- get rid of cursor
close myCursor
deallocate myCursor
-- drop temp table
drop table #tmp
--Variable table @table
declare @table as Table (int i, ...)
insert into @table
Select * from Temp
или
--Temporary table #temp
create table #temp (int i, ...)
insert into #table
Select * from Temp
--Use it
--Finally
drop table #temp
То, что вы нашли, должно быть:
DECLARE @total_count INT DEFAULT 0
SET @total_count = 10;
Переменные начинаются с @
Для информации о различиях я нашел эту статью и вопрос stackoverflow.