Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как выдать содержимое временной таблицы после процедуры вставки?  [new]
sergey_rft
Member

Откуда: Томск.
Сообщений: 282
Здравствуйте. У меня такой вопрос. Когда я написал хранимую процедуру которая из нескольких страниц формирует временную, потом мне необходимо выдать результаты клиенту, но так как запрос select идет после insert, то данные не передаются, а просто появляется сообщение что добавлена запись. Как мне выдать содержимое временной таблицы.
Спасибо.
6 авг 03, 08:05    [289485]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
sergei_p
Member

Откуда: Краснодар
Сообщений: 518
select * from #tmp
6 авг 03, 08:23    [289493]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
но так как запрос select идет после insert, то данные не передаются, а просто появляется сообщение что добавлена запись

В начале процедуры поставь SET NOCOUNT ON (и по возможности ставь всегда), а последней командой select из временной таблицы.
6 авг 03, 08:28    [289497]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
sergey_rft
Member

Откуда: Томск.
Сообщений: 282
Я так пробовал, но не получается. Например если так написать
select * from #tmp
insert into #tmp...
то вернет, то что было в таблице, но если так:
insert into #tmp...
select * from #tmp
то скажет что успешно добавил запись, и все!!!
мне надо вперед добавить, потом считать.
6 авг 03, 08:29    [289499]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Че то фигня какая то! Обычно сперва что-нибудь добавляют, а потом читают.
6 авг 03, 08:39    [289508]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
sergey_rft
Member

Откуда: Томск.
Сообщений: 282
tpg, SET NOCOUNT ON я сейчас попробую, предыдущее сообщение не тебе.
6 авг 03, 08:42    [289510]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
sergey_rft
Member

Откуда: Томск.
Сообщений: 282
Сама процедура так выглядит:
ALTER PROCEDURE dbo.GetPatData

(
@IdPat varchar(39)
)
AS
Declare @table_name varchar(38)
Declare @SQL varchar(500)

Declare @s_PatVal varchar(500)
Declare @n_PatVal int
Declare @PatID varchar(39)
Declare @AtribID varchar(39)
Declare @ClassID varchar(39)
Declare @AtribName varchar(50)
Declare @AtribType varchar(7)
Declare @u_AtribID uniqueidentifier

Declare Info CURSOR FOR SELECT Class_ID FROM Pat where ID = @IdPat
OPEN Info
FETCH NEXT FROM Info
INTO @ClassID
DEALLOCATE Info

Set @table_name = 'CLASS'
Set @table_name = @table_name + SUBSTRING(@ClassID,2,8)
Set @table_name = @table_name + SUBSTRING(@ClassID,11,4)
Set @table_name = @table_name + SUBSTRING(@ClassID,16,4)
Set @table_name = @table_name + SUBSTRING(@ClassID,21,4)
Set @table_name = @table_name + SUBSTRING(@ClassID,26,12)

create table #Tempinfo(ID varchar(39), Val varchar(500), AtrID varchar(39),type varchar(7), AtrName varchar(50))

-----------------------------------------------------------------------------------

Declare Info CURSOR FOR SELECT * FROM char500 where ID = @IdPat
OPEN Info
FETCH NEXT FROM Info
INTO @PatID, @s_PatVal, @AtribID

WHILE @@FETCH_STATUS = 0
BEGIN
--тут надо во временную табл добавлять.

SET NOCOUNT ON
insert into #Tempinfo (ID, Val, AtrID) values(@PatID, @s_PatVal, @AtribID)

FETCH NEXT FROM Info
INTO @PatID, @s_PatVal, @AtribID
END
DEALLOCATE Info
-----------------------------------------------------------------------------------

Declare Info CURSOR FOR SELECT * FROM integ where ID = @IdPat
OPEN Info
FETCH NEXT FROM Info
INTO @PatID, @n_PatVal, @AtribID

WHILE @@FETCH_STATUS = 0
BEGIN
--тут надо во временную табл добавлять.

Set @s_PatVal = cast(@n_PatVal as varchar(10))
SET NOCOUNT ON
insert into #Tempinfo (ID, Val, AtrID) values(@PatID, @s_PatVal, @AtribID)

FETCH NEXT FROM Info
INTO @PatID, @n_PatVal, @AtribID
END
DEALLOCATE Info
-----------------------------------------------------------------------------------

Set @SQL = 'Declare Info CURSOR FOR SELECT * FROM '+@table_name
exec(@SQL)
OPEN Info
FETCH NEXT FROM Info
INTO @AtribID, @AtribName, @AtribType

WHILE @@FETCH_STATUS = 0
BEGIN
Set @u_AtribID = cast(@AtribID as uniqueidentifier)
SET NOCOUNT ON
Update #Tempinfo set type = @AtribType, AtrName = @AtribName where AtrID = @u_AtribID
FETCH NEXT FROM Info
INTO @AtribID, @AtribName, @AtribType
END
DEALLOCATE Info

select * from #Tempinfo

RETURN
6 авг 03, 08:48    [289516]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
sergei_p
Member

Откуда: Краснодар
Сообщений: 518
create procedure p_test

as
set nocount on
create table #t1([id] int)
insert into #t1([id])
values(1)
insert into #t1([id])
values(2)
select * from #t1
drop table #t1
go

exec p_test
go

drop procedure p_test
go
6 авг 03, 08:55    [289521]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
sergey_rft
Member

Откуда: Томск.
Сообщений: 282
Все, получилось.
tpg, спасибо.
6 авг 03, 08:56    [289523]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А нафига SET NOCOUNT ON в цикле? Или я чего не углядел? Поставь перед первым объявлением переменных!
6 авг 03, 08:57    [289524]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
sergey_rft
Member

Откуда: Томск.
Сообщений: 282
Все испарвил.
6 авг 03, 09:09    [289540]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
Fedotov Alex
Member

Откуда:
Сообщений: 167
Это ВЕСЬ текст процедуры?!
Если да, то нафига здесь аж три курсора, которые ВСЕ можно выкинуть и заменить тремя стейтментами?
6 авг 03, 10:24    [289654]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
Glory
Member

Откуда:
Сообщений: 104760
или даже двумя (или может одним ???)
6 авг 03, 10:26    [289656]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
Fedotov Alex
Member

Откуда:
Сообщений: 167
А кроме того перед deallocate неплохо бы курсору close делать, чтоб лучше спалось.
6 авг 03, 10:27    [289657]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
ale-805
Member

Откуда: Питер
Сообщений: 670
Да уж... Вот я логику стал переносить на сервер только тогда, когда понял, что прилично умею пользоваться TSQL-ем. А так от него только медвежья услуга: лучше уж тогда оставлять do .. while'ы на клиенте. Хоть попривычнее будет
6 авг 03, 10:35    [289673]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
sergey_rft
Member

Откуда: Томск.
Сообщений: 282
А что такое стейтменты?
6 авг 03, 12:21    [289934]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Выражения.
6 авг 03, 12:26    [289945]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
sergey_rft
Member

Откуда: Томск.
Сообщений: 282
Чем они хороши в данном случае?
6 авг 03, 12:29    [289952]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
ale-805
Member

Откуда: Питер
Сообщений: 670
Ну представь себе: либо ты проходишь по какой-то таблице циклом, на каждой итерации выбираешь данные из нее и делаешь INSERT в другую таблицу. Допустим у тебя 500 записей в первой таблице. Следовательно, тебе обеспечено:
1) цикл из 500 итераций;
2) 500 отдельных инсертов в другую таблицу.
А с помощью стейтмента можно сделать что-то вроде:
insert into destTable(f1, f2, f3, ...) select f1, f2, f3 from srcTable
Разницу чуешь? Никаких циклов + никаких множественных инсертов.
6 авг 03, 12:33    [289961]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
sergey_rft
Member

Откуда: Томск.
Сообщений: 282
Разницу чую, просто я сам темин не знал. Я так и хотел сделать, но точно не знал как. Я только учусь.
те у меня так это будет выглядеть?

insert into #Tempinfo (ID, Val, AtrID) SELECT * FROM integ where ID = @IdPat
6 авг 03, 12:46    [289992]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
неважно кто
Guest
Еще возьмите в привычку всегда явно перечислять поля, чтобы при изменении структуры код не переписывать.

insert into #Tempinfo (ID, Val, AtrID) SELECT ID, Val, AtrID FROM integ where ID = @IdPat
6 авг 03, 12:56    [290016]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
sergey_rft
Member

Откуда: Томск.
Сообщений: 282
Ладно, спасибо учту.
6 авг 03, 12:58    [290019]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
sergey_rft
Member

Откуда: Томск.
Сообщений: 282
А этот кусок ведь тоже наверняка корявый?

Declare Info CURSOR FOR SELECT Class_ID FROM Pat where ID = @IdPat

OPEN Info
FETCH NEXT FROM Info
INTO @ClassID
DEALLOCATE Info
6 авг 03, 13:00    [290025]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
sergey_rft
Member

Откуда: Томск.
Сообщений: 282
Подскажите, если с insert понятно то как быть с update.?
те как этот кусок
Set @SQL = 'Declare Info CURSOR FOR SELECT * FROM '+@table_name

exec(@SQL)
OPEN Info
FETCH NEXT FROM Info
INTO @AtribID, @AtribName, @AtribType

WHILE @@FETCH_STATUS = 0
BEGIN
Set @u_AtribID = cast(@AtribID as uniqueidentifier)
SET NOCOUNT ON
Update #Tempinfo set type = @AtribType, AtrName = @AtribName where AtrID = @u_AtribID
FETCH NEXT FROM Info
INTO @AtribID, @AtribName, @AtribType
END
DEALLOCATE Info

заменить на выражение.
6 авг 03, 13:18    [290065]     Ответить | Цитировать Сообщить модератору
 Re: Как выдать содержимое временной таблицы после процедуры вставки?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Примерно так
update #Tempinfo set type=t1.AtribType,

AtrName=t1.AtribName
from #Tempinfo join
t1 on t1.AtrID=#Tempinfo.AtrID
6 авг 03, 13:43    [290124]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить