В SQL Server вы можете сформулировать это следующим образом:
ALTER PROCEDURE [dbo].[STT_Card_Entry_Temp_Write] (
@CARD_NO as VarChar(20),
@tablename as table
) AS
BEGIN
declare @sql nvarchar(max);
set @sql = '
Update live.scheme.sttakedm
set adjustment_quantit = (TM.expected_quantity - TM.counted) * -1,
take_sign = (case left((TM.expected_quantity - TM.counted), 1)
when ''-'' then ''+'' else ''-''
end),
status = ''''
from live.scheme.sttakedm stt join
@tablename TM
on TM.card_number = @CARD_NO and
TM.sequence_number = stt.sequence_number collate database_default and
TM.product_code = stt.product_code collate database_default and
stt.kind = 'B'
';
set @sql = replace(@sql, '@tablename', quotename(@tablename));
exec sp_executesql @sql,
N'@CARD_NO varchar(20)',
@CARD_NO=@CARD_NO;
set @sql = 'truncate table @tablename';
set @sql = replace(@sql, '@tablename', quotename(@tablename));
exec sp_executesql @sql;
END;
Я бы настоятельно рекомендовал вам использовать truncate table
в динамическом SQL. Вы действительно можете вызвать некоторые проблемы.
Если вы усекаете таблицу, то почему бы просто не использовать каноническое имя таблицы, используемое для передачи значений? Или - еще лучше - создайте тип таблицы, чтобы вы могли передавать ее непосредственно.