Как сохранить результаты запроса в хранимой процедуре - PullRequest
1 голос
/ 07 июля 2010

Скажем, у меня есть этот замечательный запрос в моей хранимой процедуре.

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

Скрипт Temp Table

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

Ответы [ 2 ]

2 голосов
/ 07 июля 2010
--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 .

0 голосов
/ 07 июля 2010

Это удобный шаблон для создания временной таблицы, заполнения данными, а затем, по какой-то причине, курсора по данным

-- 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...