Вопрос: Адаптер таблиц с хран процедурами на select,insert
Добавлено: 23.04.09 11:10
Автор вопроса: Jak | Web-сайт:musautomat.ru | ICQ: 340809754
Добрый день.
Пишу на vb.net + ms sql server. обмен данными между клиентом и сервером через процедуры. Использую стандартный конструктор DataSet'a для создания в нем адаптера таблицы и привязывания к ней процедур на получение и изменение данных.
Возник трабл: если в хранимых процедурах на select использовать временные таблицы, то мастер создания адаптера таблицы не показывает список полей, возвращаемых таблицей и ругается "Invalid object name 'имя врем таблицы'".
Пробовал: убирать # из название врем таблицы - не помогает; если убрать все действия с врем таблицей, а оставить только create table и drop table - работает.
ну она то и нужна в процедуре, если судить из того что ты используешь в sp временные таблицы, то в ней, я так понимаю, будет несколько конструкций. Неплохо было бы посмотреть на саму процедуру.
-- Description: <Список неотгруженной номенклатуры с фильтрами для формирования из него спец-ии на доставку>
-- Create date: <16/04/2009>
-- TODO:
-- =============================================
alter PROCEDURE [dbo].[pr_TRMTRForLogistic_lst]
@CU_ID int = NULL, -- ID заказчика
@DE_BUILD_NAME varchar(500)= NULL, -- наименование объекта
@DE_BUILD_CODE varchar(255)= NULL, -- код стройки
@SM_YEAR int = NULL, -- срок поставки МТР год
@SM_MONTH int = NULL -- срок поставки МТР месяц
AS
BEGIN
--SET NOCOUNT ON
DECLARE @start_time datetime -- время начала работы процедуры
DECLARE @exec_time bigint -- длительность работы процедуры (мс)
DECLARE @cur_spec_code int -- код_спец из курсора по спец-иям
-- проверка на адекватность запускающего процедуру.
-- если не заданы критерии отбора, то выходим, что бы не положить сервер
IF (
@CU_ID IS NULL AND
@DE_BUILD_NAME IS NULL AND
@DE_BUILD_CODE IS NULL AND
@SM_YEAR IS NULL AND
@SM_MONTH IS NULL
)
BEGIN
RAISERROR ('Не задано ни одного критерия поиска. Это может привести выдаче несоразмерно большого количества номенклатуры и чрезмерной загрузке сервера. Чем больше Вы введете критериев, тем быстрее получите результат. Введите хотя бы один.',15,1)
RETURN
END
SELECT @start_time = GETDATE()
-- Временная таблица оборудования, отобранного по фильтрам
CREATE TABLE #eq_filtered
(
eq_code INT, -- Оборудование.Код
spec_code INT -- Оборудование.Код_спец
)
-- курсор по всем спецификациям, в которые входит отобранное оборудование, для привязки МГХ
DECLARE #spec_cursor CURSOR FOR
SELECT
spec_code
FROM
#eq_filtered
GROUP BY
spec_code
-- Получим Коды оборудования, удовлетворяющего фильтрам
INSERT INTO #eq_filtered
(
eq_code, -- Оборудование.Код
spec_code -- Оборудование.Код_спец
)
SELECT
eq.Код,
eq.Код_спец
FROM
tblDEMANDS de
inner join
tblSPECIFICATION sp on de.de_id = sp.sp_deid
inner join
Спец spec on sp.sp_idspec = spec.Код_спец_ключ
inner join
Оборудование eq on eq.Код_спец = spec.Код_спец
left join
tbl_TRSpecItems tsi on eq.Код = tsi.TSI_Eq_Code
left join
tblSPECIFICATION_MONTH sm on sm.SM_SPID = sp.SP_ID AND sm.SM_SIID = eq.Код
LEFT JOIN
vSPR_CUSTOMER cu ON de.de_cuid = cu.CU_ID
WHERE
-- фильтры
( -- по заказчику
de.de_cuid = @CU_ID OR
@CU_ID IS NULL
) AND
( -- по сроку
sm.sm_year = @SM_YEAR OR
@SM_YEAR IS NULL
) AND
( -- по сроку
sm.sm_month = @SM_MONTH OR
@SM_MONTH IS NULL
) AND
( -- по наименованию объекта
de.DE_CODE_OBJ LIKE '%'+@DE_BUILD_NAME+'%' OR
@DE_BUILD_NAME IS NULL
) AND
( -- по коду стройки
de.DE_CODE_BILD = @DE_BUILD_CODE OR
@DE_BUILD_CODE IS NULL
) AND
tsi.TSI_TRSP_ID IS NULL
-- Проверим наличие МГХ для всех спецификаций, в которые входит отобранное оборудование
OPEN #spec_cursor
FETCH NEXT FROM #spec_cursor INTO @cur_spec_code
WHILE @@FETCH_STATUS = 0
BEGIN
print convert(varchar,@cur_spec_code)
EXEC dbo.pr_TRAddWeight @cur_spec_code
FETCH NEXT FROM #spec_cursor INTO @cur_spec_code
END
DEALLOCATE #spec_cursor
-- Выводим отобранное оборудование
SELECT
de.de_cuid, -- код заказчика
ISNULL(cu.CU_TYPEOWNER, '')+ ' "'
+ ISNULL(cu.CU_DESC, '') + '"', -- заказчик
de.DE_CODE_BILD BUILD_CODE, -- код стройки
de.DE_CODE_OBJ BUILD_NAME, -- наим объекта
sm.sm_year, -- срок поставки
sm.sm_month, -- срок поставки
eq.Оборуд,
tsi.*
FROM
tblDEMANDS de
inner join
tblSPECIFICATION sp on de.de_id = sp.sp_deid
inner join
Спец spec on sp.sp_idspec= spec.Код_спец_ключ
inner join
Оборудование eq on eq.Код_спец = spec.Код_спец
inner join
#eq_filtered eqtmp on eqtmp.eq_code= eq.Код
left join
tbl_TRSpecItems tsi on eq.Код = tsi.TSI_Eq_Code
left join
tblSPECIFICATION_MONTH sm on sm.SM_SPID = sp.SP_ID AND
курсор, хрен с ним. знаю, что плохо. не суть.
помогла конструкция в начале процедуры
IF 1=0 BEGIN
SET FMTONLY OFF
END
на англоязычных форумах этот вопрос много обсуждается.
набери в гугле "temporary tables in ms sql stored procedures for select in net tableadapter" будет много ссылок
Это Баг! в microsoft'e о нем знаю и, типа, работают над ним