Я новичок в T-SQL; весь мой опыт - в полностью другой среде базы данных (Openedge). Я научился достаточно, чтобы написать процедуру ниже - но также достаточно, чтобы знать, что я не знаю достаточно!
Эта рутина скоро должна войти в живую среду, и она работает, но я совершенно уверен, что в ней есть ряд с ** к-ов и ошибок, о которых я ничего не знаю.
Процедура копирует данные из таблицы A в таблицу B, заменяя данные в таблице B. Таблицы могут находиться в любой базе данных. Я планирую вызывать эту процедуру несколько раз из другой хранимой процедуры. Разрешения не являются проблемой: подпрограмма будет запущена dba как временное задание.
Могу ли я получить ваши предложения о том, как сделать так, чтобы они соответствовали передовым практикам? Чтобы пуленепробиваемые это?
ALTER PROCEDURE [dbo].[copyTable2Table]
@sdb varchar(30),
@stable varchar(30),
@tdb varchar(30),
@ttable varchar(30),
@raiseerror bit = 1,
@debug bit = 0
as
begin
set nocount on
declare @source varchar(65)
declare @target varchar(65)
declare @dropstmt varchar(100)
declare @insstmt varchar(100)
declare @ErrMsg nvarchar(4000)
declare @ErrSeverity int
set @source = '[' + @sdb + '].[dbo].[' + @stable + ']'
set @target = '[' + @tdb + '].[dbo].[' + @ttable + ']'
set @dropStmt = 'drop table ' + @target
set @insStmt = 'select * into ' + @target + ' from ' + @source
set @errMsg = ''
set @errSeverity = 0
if @debug = 1
print('Drop:' + @dropStmt + ' Insert:' + @insStmt)
-- drop the target table, copy the source table to the target
begin try
begin transaction
exec(@dropStmt)
exec(@insStmt)
commit
end try
begin catch
if @@trancount > 0
rollback
select @errMsg = error_message(),
@errSeverity = error_severity()
end catch
-- update the log table
insert into HHG_system.dbo.copyaudit
(copytime, copyuser, source, target, errmsg, errseverity)
values( getdate(), user_name(user_id()), @source, @target, @errMsg, @errSeverity)
if @debug = 1
print ( 'Message:' + @errMsg + ' Severity:' + convert(Char, @errSeverity) )
-- handle errors, return value
if @errMsg <> ''
begin
if @raiseError = 1
raiserror(@errMsg, @errSeverity, 1)
return 1
end
return 0
END
Спасибо!