Могу ли я передать имя таблицы в хранимую процедуру? - PullRequest
0 голосов
/ 30 октября 2019

У меня есть хранимая процедура, которую я хочу использовать, но мне нужно передать в нее имя таблицы.

ALTER PROCEDURE [dbo].[STT_Card_Entry_Temp_Write] 
@CARD_NO as VarChar(20),
@tablename as table
AS
BEGIN
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 (nolock) stt
        inner join  @tablename TM (NOLOCK) 
        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'

truncate table @tablename

END

Это мой код, который в настоящее время не работает.

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

В 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. Вы действительно можете вызвать некоторые проблемы.

Если вы усекаете таблицу, то почему бы просто не использовать каноническое имя таблицы, используемое для передачи значений? Или - еще лучше - создайте тип таблицы, чтобы вы могли передавать ее непосредственно.

0 голосов
/ 30 октября 2019

Вы не упоминаете используемый вами механизм базы данных, но нужная вам функция называется «динамический SQL»;Google - ваш друг.

Я бы очень нервничал из-за разрешения truncate table @tablename в динамическом SQL, хотя - это действительно вызывает катастрофические ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...