@nrv

Как запихнуть этот код в хранимую процедуру?

Здравствуйте.
Есть код, который работает сам по себе, но не удается поместить его в хранимую процедуру. SQl Server 2008
USE STG3;
go
create proc [dbo].[nrv_test] as 
begin
drop table #t;
go

select 1 as val into #t;

if (SELECT COUNT(*) from #t) > 0
	raiserror('error number 1!!',16,1);

drop table #t;
go

select 2 as val into #t;

if (SELECT COUNT(*) from #t) > 0
	raiserror('error number 2!!',16,1);
end

Ошибка

Incorrect syntax near ';'


There is already an object named '#t' in the database.


Incorrect syntax near 'end'.

UPD: пока гуглил узнал, что go в хранимых процедурах использлвать нельзя, проблему это не отменяет, просто формулировка чуть-чуть другая:
USE STG3;
go

create proc [dbo].[nrv_test] as 
begin
drop table #t_nrv
select 1 as val into #t_nrv

if (SELECT COUNT(*) from #t_nrv) > 0
	raiserror('error number 1!!',16,1)

drop table #t_nrv

select 2 as val into #t_nrv

if (SELECT COUNT(*) from #t_nrv) > 0
	raiserror('error number 2!!',16,1)
end

Ошибка
There is already an object named '#t_nrv' in the database

Как заставить SQL Server понять что до того как пойдет select into, таблица будет уже дропнута, при том что код должен быть в хранимой процедуре и go там использовать нельзя
  • Вопрос задан
  • 116 просмотров
Решения вопроса 1
@nrv Автор вопроса
В одном из форумов нашёл отсылку к документации - прошел по ссылке - действительно, нельзя в процедуре создавать дважды таблицу с одним идентификатором. Такое вот дурацкое ограничение. Так что если таблица каждый раз разная, то только каждый раз использовать разный идентификатор. Я использовал один, так код был однотипный и копипастил его просто.
Цитата:
If more than one temporary table is created inside a single stored procedure or batch, they must have different names.
Отсюда:
https://docs.microsoft.com/en-us/sql/t-sql/stateme...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
NeiroNx
@NeiroNx
Программист
попробовать без ';'
Ответ написан
@d-stream
Готовые решения - не подаю, но...
Проверить наличие таблицы:

select OBJECT_ID('tempdb..#t_nrv','U')

есть таблица - будет значение ее id, иначе - null

только если таблица нужна исключительно внутри процедуры - лучше использовать не #table а @table

иначе будут танцы...

declare @qqqq table (id primary key, value nvarchar(max))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы